原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12082043
游戏是实现了,但是如果有个欢迎界面和一个结束界面就更好了。
欢迎界面可以用于预加载一些资源,初始化数据,显示logo,copyright之类的东西,而结束画面用于显示游戏得分,以及返回游戏,退出游戏等等。
本系列到这里,欢迎场景的建立应该不用多说了。还是一样的WelcomeLayer和WelcomeScene。
WelcomeLayer的init主要实现的功能有:
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);//重复2次 CCCallFuncN* repeatdone=CCCallFuncN::create(this,callfuncN_selector(WelcomeLayer::loadingDone));//loadingDone用来转换场景 CCSequence* sequence=CCSequence::create(repeat,repeatdone); loading->runAction(sequence);
getHighestHistorySorce();
(1)GameOverLayer是结束画面,它比较特殊的一点是create,我们给它传个参数,这个参数就是在游戏场景切换到结束场景传递的分数值。
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)中间显示本局分数,左上角显示历史最高分,当切换到结束画面时,分数做一个放大缩小的动画。
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)如果当前分数破纪录,左上角历史最高分要进行更新。
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个场景。欢迎界面,游戏界面和游戏结束界面。它们的关系是:
WelcomeScene→GameScene↔GameOverScene
场景的切换我们使用
CCDirector::sharedDirector()->replaceScene(CCScene* pSecne);//相关资源会进行销毁
关于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调试的时候没注意到这个问题,但是当移植到安卓的时候才发现,按Back键竟然木有用,而Home键只能切换到主屏,也不能退出游戏。
还记得CCLayer从哪里继承来的么?我们再看一遍:
CCLayer : public CCNode, public CCTouchDelegate, public CCAccelerometerDelegate, public CCKeypadDelegate
最后的CCKeypadDelegate就是解决这个问题的方法。
在各个主场景的主层中重载
virtual void keyBackClicked();//对应back键 virtual void keyMenuClicked();//对应home键
在init中调用
this->setKeypadEnabled(true);
keyBackClicked()的实现
void GameOverLayer::keyBackClicked() { CCDirector::sharedDirector()->end();//结束游戏 }
这一节感觉有点多啊。。。就这样吧。
效果图