我们用PlaneLayer来放置飞机,我们的主角。和导演类CCDirector的shareDirector一样,我们在PlaneLayer中也添加PlaneLayer的一个静态指针sharePlane。但是这里和导演类不一样的是,我们必须在创建PlaneLayer后才能使用这个sharePlane,而且在PlaneLayer销毁后就不能使用它了。
PlaneLayer的头文件如下:
#pragma once #include "cocos2d.h" USING_NS_CC; class PlaneLayer : public CCLayer { public: PlaneLayer(void); ~PlaneLayer(void); static PlaneLayer* create(); //实现create函数 virtual bool init(); public: static PlaneLayer* sharedPlane; //提供sharePlane全局指针 };PlaneLayer.cpp文件如下:
#include "PlaneLayer.h" PlaneLayer* PlaneLayer::sharedPlane=NULL; PlaneLayer::PlaneLayer(void) { isAlive=true; } PlaneLayer::~PlaneLayer(void) { } PlaneLayer* PlaneLayer::create() { PlaneLayer* pRet=new PlaneLayer(); if(pRet && pRet->init()) { pRet->autorelease(); sharedPlane=pRet; return pRet; } else { CC_SAFE_DELETE(pRet); return NULL; } }
我们还需要把这个层添加到GameLayer.cpp的init函数中,才能调用。这样就可以把飞机添加到场景中。
//加入planeLayer this->planeLayer=PlaneLayer::create(); this->addChild(planeLayer);
有一个帧动画,就是飞机在飞行过程中机尾是在喷火的。
下面介绍一下帧动画的使用步骤:
(1)create,创建CCAnimation类实例
(2)setDelayPerUnit,设置帧间间隔时间
(3)addSpriteFrame,添加帧图片
(4)create,创建CCAnimation类实例,传入(1)从CCAnimation实例,注意CCAnimation是动画过程的名词,CCAnimate才是动画动作。
(5)精灵调用runAction
(6)注意CCAnimationCache这是一个动画类全局缓冲池。可以将大量重复动画放在里面使用,加快游戏速度。
bool PlaneLayer::init() { bool bRet=false; do { CC_BREAK_IF(!CCLayer::init()); CCSize winSize=CCDirector::sharedDirector()->getWinSize(); //加载全局资源 CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("ui/shoot.plist"); CCSprite* plane=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("hero1.png")); //把飞机放置在底部中央 plane->setPosition(ccp(winSize.width/2,plane->getContentSize().height/2)); //添加精灵,AIRPLANE是tag this->addChild(plane,0,AIRPLANE); //闪烁动画 CCBlink* blink=CCBlink::create(1,3); CCAnimation* animation=CCAnimation::create(); animation->setDelayPerUnit(0.1f); animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("hero1.png")); animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("hero2.png")); CCAnimate* animate=CCAnimate::create(animation); //帧动画 plane->runAction(blink); //执行闪烁动画 plane->runAction(CCRepeatForever::create(animate)); //执行帧动画 bRet=true; } while (0); return bRet; }
(1)bool isAlive;判断飞机主角是否活着的标志,初始为true
(2)int score;分数,刚开始为0
(3)void MoveTo(CCPoint location);飞机层移动的方法。触摸飞机移动
(4)void Blowup(int passScore);飞机爆炸的方法。当主角碰到炸弹死亡后执行爆炸动画效果
(5)void RemovePlane();移除飞机并转换至GameOver场景
以上这些内容都会在后续章节中有介绍。