[置顶] 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡

原创作品,转载请标明http://blog.csdn.net/jackystudio/article/details/12082043

游戏是实现了,但是如果有个欢迎界面和一个结束界面就更好了。

欢迎界面可以用于预加载一些资源,初始化数据,显示logo,copyright之类的东西,而结束画面用于显示游戏得分,以及返回游戏,退出游戏等等。


1.欢迎界面

本系列到这里,欢迎场景的建立应该不用多说了。还是一样的WelcomeLayer和WelcomeScene。

WelcomeLayer的init主要实现的功能有:

1.1.将plist载入全局cache中

 

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("ui/shoot_background.plist");

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("ui/shoot.plist");

 

1.2.加入copyright和loading动画

 

//加入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);

 

1.3.加载历史最高分

 

getHighestHistorySorce();

 


2.结束画面

(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.场景切换

3.1.场景切换

这个游戏总共有3个场景。欢迎界面,游戏界面和游戏结束界面。它们的关系是:

 

WelcomeScene→GameScene↔GameOverScene

场景的切换我们使用

 

 

CCDirector::sharedDirector()->replaceScene(CCScene* pSecne);//相关资源会进行销毁

关于popScene和pushScene的使用,有兴趣的可以自己百度。


 

3.2.场景切换效果

在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",

 


4.游戏退出

在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();//结束游戏

}

 

 

这一节感觉有点多啊。。。就这样吧。

效果图

[置顶] 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡      [置顶] 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡

 

你可能感兴趣的:(cocos2d-x)