飛機發(fā)射子彈要注意的幾點是:
1.子彈的渲染效率
2.子彈的初始位置和飛行效果
3.子彈的回收
4.子彈層提供的接口
本文先講解子彈的渲染效率問題??磧蓚€很典型的例子,將1000個icon圖精靈加入游戲。(左下角三個值從上到下分別是精靈數(shù),渲染每幀所需要的時間,幀數(shù))
(1)示例
for(int i = 0;i < 1000;++i){
int x = arc4random()%960;
int y = arc4random()%640;
CCSprite* testIcon = CCSprite::create("Icon.png");
testIcon->setPosition( ccp(x, y) );
this->addChild(testIcon);
}
(2)效果
(1)示例
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("Icon.png", 1000);
batchNode->setPosition(CCPointZero);
this->addChild(batchNode);
for(int i = 0;i < 1000;++i){
int x = arc4random()%960;
int y = arc4random()%640;
CCSprite* testIcon = CCSprite::createWithTexture(batchNode->getTexture());
testIcon->setPosition( ccp(x, y) );
batchNode->addChild(testIcon);
}
(2)效果圖
從左下角的渲染次數(shù)(第一行)和渲染FPS(第三行),我們就可以看出,普通渲染需要進行1000次,而批次渲染只要1次就可以完成。差別在哪?CCSpriteBatchNode這個精靈批次渲染類。
普通渲染機制:
準備,渲染,清除。準備,渲染,清除。...準備,渲染,清除。100次啊100次?。?!
批次渲染機制:
準備,渲染,渲染....渲染,清除。是不是快多了?
但必須注意的是,使用CCSpriteBatchNode,所有的精靈必須是同一張圖,也不能指定精靈的深度,所有精靈必須在同一渲染層。
子彈的添加其實就是使用CCSpriteBatchNode的最佳例子。
bool BulletLayer::init()
{
bool bRet=false;
do
{
CC_BREAK_IF(!CCLayer::init());
CCTexture2D *texture = CCTextureCache::sharedTextureCache()->textureForKey("ui/shoot.png");
bulletBatchNode = CCSpriteBatchNode::create(texture);//bulletBatchNode為CCSpriteBatchNode類型成員變量
this->addChild(bulletBatchNode);
bRet=true;
} while (0);
return bRet;
}
void BulletLayer::AddBullet(float dt)
{
CCSprite* bullet=CCSprite::createWithSpriteFrameName("bullet1.png");
bulletBatchNode->addChild(bullet);//這里子彈要添加到bulletBatchNode中,效果如下左圖
//this->addChild(bullet);換成這句渲染批次和FPS,如下右圖
}
我們這里調用
this->schedule(schedule_selector(BulletLayer::AddBullet),0.01f);
看一下效果,因為間隔時間0.01s,所以子彈看起來是柱狀的,好丑。。??匆幌拢秩九魏虵PS的比較:一個是4(有其他精靈),另一個則是181。如果你發(fā)現(xiàn)子彈只是在左下角而且精靈數(shù)不對,淡定。。。這里子彈已經(jīng)做了回收處理,而且子彈的初始位置和移動都設置好了。這些將在[下一篇][3]介紹,這里先放圖。
更多建議: