【cocos2d-x入门实战】微信飞机大战之10:UFO层特殊道具的加入
【cocos2d-x入门实战】微信飞机大战之十:UFO层特殊道具的加入
转载请表明地址:http://blog.****.net/jackystudio/article/details/11961795
游戏的趣味性就在于不时的给你一些惊喜。当然如果只是简单的子弹打飞机,玩久了也会腻,所以加入一些好玩的道具可以很好的提高游戏的可玩性。
飞机大战中也有不时从天而降的UFO(UFO是腾讯给他取的,我也是从游戏资源里发现这么个名字,照搬啦)。这里主要有两种道具,双排子弹和大炸弹。
1.多子弹层
多子弹和单子弹是一样的实现。请参照第五篇和第六篇的处理,这里就不附代码了。
要注意的地方有:
(1)使用CCSpriteBatchNode处理提高渲染效率。
(2)子弹的初始位置,有两排,和单子弹层略有不同。
(3)子弹的飞行效果和回收,这和单子弹层是一样的。
(4)其他差别就是精灵图片不一样,发射频率不一样,多子弹是有时限的,不能是CCRepeateForever了。
2.UFO层
UFO层有两类精灵道具:
(1)ufo1,蓝色降落伞道具,吃到了就有多子弹效果。
(2)ufo2,红色降落伞道具,吃到了屏幕左下角会出现炸弹数,点击会全屏秒杀。
这里以多子弹道具的掉落为例。炸弹道具的掉落类似不赘述。
2.1.添加多子弹降落伞道具
void UFOLayer::AddMutiBullets(float dt) { //创建多子弹道具精灵 CCSprite* mutiBullets=CCSprite::create(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("ufo1.png")); //获得随机位置 CCSize mutiBlletsSize=mutiBullets->getContentSize(); CCSize winSize=CCDirector::sharedDirector()->getWinSize(); int minX=mutiBlletsSize.width/2; int maxX=winSize.width-mutiBlletsSize.width/2; int rangeX=maxX-minX; int actualX=(rand()%rangeX)+minX; //添加到UFO层并加入CCArray数组 mutiBullets->setPosition(ccp(actualX,winSize.height+mutiBlletsSize.height/2)); this->addChild(mutiBullets); this->m_pAllMutiBullets->addObject(mutiBullets);//m_pAllMutibullets是CCArray数组指针,成员变量 //这是一个比较cute的动画,也可以采用CCEaseAction类处理 CCMoveBy* move1 = CCMoveBy::create(0.5f, CCPointMake(0, -150)); CCMoveBy* move2 = CCMoveBy::create(0.3f, CCPointMake(0, 100)); CCMoveBy* move3 = CCMoveBy::create(1.0f, CCPointMake(0,0-winSize.height-mutiBlletsSize.height/2)); CCCallFuncN* moveDone = CCCallFuncN::create(this,callfuncN_selector(UFOLayer::mutiBulletsMoveFinished)); CCFiniteTimeAction* sequence = CCSequence::create(move1,move2,move3,moveDone,NULL); //执行动画 mutiBullets->runAction(sequence); }在init()用schedule来控制道具掉落的频率。
2.2.多子弹降落伞道具的回收
如果玩家未吃到该道具,在超出屏幕范围后,自动回收。
void UFOLayer::mutiBulletsMoveFinished(CCNode* pSender) { CCSprite* mutiBullets=(CCSprite*)pSender; this->removeChild(mutiBullets,true);//从屏幕中移除 this->m_pAllMutiBullets->removeObject(mutiBullets);//从数组中移除 }
2.3.提供的移除接口
如果玩家吃到该道具,调用此接口,移除并回收该道具。
void UFOLayer::RemoveMutiBullets(CCSprite* mutiBullets) { this->removeChild(mutiBullets,true); this->m_pAllMutiBullets->removeObject(mutiBullets); }
3.碰撞检测
在GameLayer的update中执行主角与ufo的碰撞检测。
//mutiBullets & airplane CheckCollision CCObject *ut; CCARRAY_FOREACH(this->ufoLayer->m_pAllMutiBullets,ut) { CCSprite* mutiBullets=(CCSprite*)ut; if (CCRect::CCRectIntersectsRect(PlaneLayer::sharedPlane->boundingBox(),mutiBullets->boundingBox()))//玩家吃到双子弹道具 { this->ufoLayer->RemoveMutiBullets(mutiBullets);//调用移除双子弹道具 this->bulletLayer->StopShoot();//停止单子弹的射击 this->mutiBulletsLayer->StartShoot();//开启双子弹的射击 this->bulletLayer->StartShoot(6.2f);//还记得在第四篇StartShoot我们将它设置为缺省函数?这样一来就可以实现双子弹结束后切换回单子弹射击 } }炸弹道具也是一样的实现方式,但是吃到了它并不会直接全屏爆炸,而是会出现在左下角供玩家随时使用,这部分在后一篇控制层中一并讲解。
效果图