昨天收到了電子工業(yè)出版社寄過來的《cocos2d-x游戲開發(fā)之旅》這本書了,書還是不錯的,那天rp爆發(fā)在微博上抽到的獎品。
感覺自己這個系列寫的好像有點慢,但是想說盡可能把每一個點介紹到,所以,嫌啰嗦的請見諒咯。。。
我在這個游戲中對精靈和層的處理方式是一個層中只放一種精靈,把精靈的接口提供出去,然后通過層的疊加來實現(xiàn)整個游戲。
飛機是Hero,所以它應該是一個單例類,cocos2d-x中有很多單例類,成員函數(shù)中有sharedxxxx的基本上就是。比如導演類,幾個cache類等等。但是我這里偷個懶,并沒有把它處理成單例類,因為整個游戲結(jié)構(gòu)比較簡單,但是在大的項目中就不能這么處理了。
和導演類的shareDirector一樣,我們在PlaneLayer中也添加PlaneLayer的一個靜態(tài)指針sharedPlane。但是和導演類不一樣的是,必須在創(chuàng)建PlaneLayer后才能使用這個sharedPlane,而且在PlaneLayer銷毀后就不能使用它,這里需要我們自己控制好整個流程。
//PlaneLayer.h
class PlaneLayer :
public CCLayer
{
public:
PlaneLayer(void);
~PlaneLayer(void);
static PlaneLayer* create();//實現(xiàn)create函數(shù)
virtual bool init();
public:
static PlaneLayer* sharedPlane;//提供sharedPlane全局指針
};
//PlaneLayer.cpp
PlaneLayer* PlaneLayer::sharedPlane=NULL;//靜態(tài)變量要在cpp外初始化
PlaneLayer* PlaneLayer::create()
{
PlaneLayer *pRet = new PlaneLayer();
if (pRet && pRet->init())
{
pRet->autorelease();
sharedPlane=pRet;//獲得靜態(tài)指針sharedPlane的值
return pRet;
}
else
{
CC_SAFE_DELETE(pRet);
return NULL;
}
}
和示例不一樣,這里的create我們要自己實現(xiàn),而不能簡單的使用LAYER_CREATE_FUNC宏了。
而這個層的使用,只需要在上一篇中的GameLayer.cpp的init函數(shù)里調(diào)用就可以了。
//加入planeLayer
this->planeLayer=PlaneLayer::create();
this->addChild(planeLayer);
細心的玩家會發(fā)現(xiàn),飛機在飛行過程中機尾是在噴火的,其實這就是幀動畫。
這里篇幅有限,就簡單介紹下幀動畫和這里用到的其他動畫效果。
幀動畫的使用步驟:
(1)create,創(chuàng)建CCAnimation類實例。
(2)setDelayPerUnit,設置幀間間隔時間。
(3)addSpriteFrame,添加幀圖片。
(4)create,創(chuàng)建CCAnimate類實例,傳入(1)的CCAnimation實例,注意CCAnimation是動畫過程是名詞,CCAnimate才是動畫動作。
(5)精靈調(diào)用runAction即可使用。
(6)注意CCAnimationCache這也是一個動畫類全局緩沖池。如果大量重復動畫可以放里面使用,加快游戲速度。
bool PlaneLayer::init()
{
bool bRet=false;
do
{
CC_BREAK_IF(!CCLayer::init());
CCSize winSize=CCDirector::sharedDirector()->getWinSize();
//創(chuàng)建飛機精靈前要先調(diào)用CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("shoot.plist");加載全局資源
//我把這個調(diào)用plist放到welcome.cpp中了。不然plane會空指針。
CCSprite* plane=CCSprite::create(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("hero1.png"));
plane->setPosition(ccp(winSize.width/2,plane->getContentSize().height/2));//飛機放置在底部中央
this->addChild(plane,0,AIRPLANE);//添加精靈,AIRPLANE是tag
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);//執(zhí)行閃爍動畫
plane->runAction(CCRepeatForever::create(animate));// 執(zhí)行幀動畫
bRet=true;
} while (0);
return bRet;
}
那這些CCBlink,CCRepeaterForever又是什么?
這就是cocos2d-x提供的一些動畫效果,其實用起來都很簡單,無非是設置duration持續(xù)時長,repeat重復次數(shù),和一些位移的坐標點,角度等等,就可以直接運行??梢栽赾ocos2d-x的test示例中找到。
給GameLayer層添加成員變量PlaneLayer型指針,在GameLayer::init()中調(diào)用PlaneLayer的create函數(shù)初始化飛機層。
bool GameLayer::init()
{
bool bRet=false;
do
{
...省略代碼
//加入planeLayer
this->planeLayer=PlaneLayer::create();
this->addChild(planeLayer);
...省略代碼
bRet=true;
} while (0);
return bRet;
}
(1)成員變量bool型isAlive,作為判斷飛機主角是否活著的標志,初始為true。
(2)成員變量int型score,作為分數(shù),出師為0,最高為20億。
(3)void MoveTo(CCPoint location);飛機層移動的方法。主要是用于觸摸飛機移動。會在[第七篇:觸摸事件和優(yōu)先級][1]有介紹。
(4)void Blowup(int passScore);飛機爆炸方法。當主角碰到炸彈死亡后執(zhí)行爆炸動畫效果。在[第八篇:自定義敵機精靈][2]有介紹。
(5)void RemovePlane();移除飛機并轉(zhuǎn)換至GameOver場景。
以上這幾個方法和屬性在后面文章中會有介紹。
現(xiàn)在飛機出現(xiàn)了,在一開始閃爍3次以后,結(jié)合上篇的背景滾動,飛機看起來就像是在噴氣往前飛了,當然飛機相對屏幕的位置還是不變的(底部中央)。。。吼吼。。。
效果圖
更多建議: