游戲是實現(xiàn)了,但是如果有個歡迎界面和一個結(jié)束界面就更好了。
歡迎界面可以用于預(yù)加載一些資源,初始化數(shù)據(jù),顯示logo,copyright之類的東西,而結(jié)束畫面用于顯示游戲得分,以及返回游戲,退出游戲等等。
本系列到這里,歡迎場景的建立應(yīng)該不用多說了。還是一樣的WelcomeLayer和WelcomeScene。
WelcomeLayer的init主要實現(xiàn)的功能有:
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("ui/shoot_background.plist");
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("ui/shoot.plist");
//加入copyright
...
//加入loading
CCSprite* loading=CCSprite::create(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_loading1.png"));
loading->setPosition(ccp(winSize.width/2,winSize.height/2-40));
this->addChild(loading);
CCAnimation* animation=CCAnimation::create();//幀動畫
animation->setDelayPerUnit(0.2f);
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_loading1.png"));
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_loading2.png"));
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_loading3.png"));
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("game_loading4.png"));
CCAnimate* animate=CCAnimate::create(animation);
CCRepeat* repeat=CCRepeat::create(animate,2);//重復(fù)2次
CCCallFuncN* repeatdone=CCCallFuncN::create(this,callfuncN_selector(WelcomeLayer::loadingDone));//loadingDone用來轉(zhuǎn)換場景
CCSequence* sequence=CCSequence::create(repeat,repeatdone);
loading->runAction(sequence);
getHighestHistorySorce();
(1)GameOverLayer是結(jié)束畫面,它比較特殊的一點是create,我們給它傳個參數(shù),這個參數(shù)就是在游戲場景切換到結(jié)束場景傳遞的分數(shù)值。
GameOverLayer* GameOverLayer::create(int passScore)
{
GameOverLayer *pRet = new GameOverLayer();
pRet->score=passScore;//score是成員變量
if (pRet && pRet->init())
{
pRet->autorelease();
return pRet;
}
else
{
delete pRet;
pRet = NULL;
return NULL;
}
}
(2)中間顯示本局分數(shù),左上角顯示歷史最高分,當切換到結(jié)束畫面時,分數(shù)做一個放大縮小的動畫。
CCDelayTime* delay=CCDelayTime::create(1.0f);
CCScaleTo* scalebig=CCScaleTo::create(1.0f,3.0f);
CCScaleTo* scalelittle=CCScaleTo::create(0.3f,2.0f);
CCFiniteTimeAction* sequence=CCSequence::create(delay,scalebig,scalelittle,NULL);
finalScore->runAction(sequence);
(3)如果當前分數(shù)破紀錄,左上角歷史最高分要進行更新。
if (score>highestHistoryScore)
{
CCUserDefault::sharedUserDefault()->setIntegerForKey("HighestScore",score);
highestHistoryScore=score;
CCDelayTime* delayChange=CCDelayTime::create(1.3f);
CCMoveBy* moveOut=CCMoveBy::create(0.1f,ccp(0,100));
CCCallFuncN* beginChange=CCCallFuncN::create(this,callfuncN_selector(GameOverLayer::beginChangeHighestScore));
CCMoveBy* moveIn=CCMoveBy::create(0.1f,ccp(0,-100));
CCFiniteTimeAction* sequence=CCSequence::create(delayChange,moveOut,beginChange,moveIn,NULL);
highestScore->runAction(sequence);
}
(4)右下角有返回游戲功能CCMenu,點擊后進行場景切換。
這個游戲總共有3個場景。歡迎界面,游戲界面和游戲結(jié)束界面。它們的關(guān)系是:
WelcomeScene→GameScene?GameOverScene
場景的切換我們使用
CCDirector::sharedDirector()->replaceScene(CCScene* pSecne);//相關(guān)資源會進行銷毀
關(guān)于popScene和pushScene的使用,有興趣的可以自己百度。
在cocos2d-x的示例中有這么多的場景過渡效果。當然它們的使用都是一致的,把下一個場景指針傳入create中獲得一個帶動畫效果的新場景指針,進行切換即可。喜歡什么樣的效果,自己去挑吧。
"CCTransitionJumpZoom",
"CCTransitionProgressRadialCCW",
"CCTransitionProgressRadialCW",
"CCTransitionProgressHorizontal",
"CCTransitionProgressVertical",
"CCTransitionProgressInOut",
"CCTransitionProgressOutIn",
"CCTransitionCrossFade",
"TransitionPageForward",
"TransitionPageBackward",
"CCTransitionFadeTR",
"CCTransitionFadeBL",
"CCTransitionFadeUp",
"CCTransitionFadeDown",
"CCTransitionTurnOffTiles",
"CCTransitionSplitRows",
"CCTransitionSplitCols",
"CCTransitionFade",
"FadeWhiteTransition",
"FlipXLeftOver",
"FlipXRightOver",
"FlipYUpOver",
"FlipYDownOver",
"FlipAngularLeftOver",
"FlipAngularRightOver",
"ZoomFlipXLeftOver",
"ZoomFlipXRightOver",
"ZoomFlipYUpOver",
"ZoomFlipYDownOver",
"ZoomFlipAngularLeftOver",
"ZoomFlipAngularRightOver",
"CCTransitionShrinkGrow",
"CCTransitionRotoZoom",
"CCTransitionMoveInL",
"CCTransitionMoveInR",
"CCTransitionMoveInT",
"CCTransitionMoveInB",
"CCTransitionSlideInL",
"CCTransitionSlideInR",
"CCTransitionSlideInT",
"CCTransitionSlideInB",
在win32調(diào)試的時候沒注意到這個問題,但是當移植到安卓的時候才發(fā)現(xiàn),按Back鍵竟然木有用,而Home鍵只能切換到主屏,也不能退出游戲。
還記得CCLayer從哪里繼承來的么?我們再看一遍:
CCLayer : public CCNode, public CCTouchDelegate, public CCAccelerometerDelegate, public CCKeypadDelegate
最后的CCKeypadDelegate就是解決這個問題的方法。
在各個主場景的主層中重載
virtual void keyBackClicked();//對應(yīng)back鍵
virtual void keyMenuClicked();//對應(yīng)home鍵
在init中調(diào)用
this->setKeypadEnabled(true);
keyBackClicked()的實現(xiàn)
void GameOverLayer::keyBackClicked()
{
CCDirector::sharedDirector()->end();//結(jié)束游戲
}
這一節(jié)感覺有點多啊。。。就這樣吧。
效果圖
http://wiki.jikexueyuan.com/project/cocos2d-x-getting-real/images/13.1.jpeg" alt="" />
http://wiki.jikexueyuan.com/project/cocos2d-x-getting-real/images/13.2.jpeg" alt="" />