zoukankan      html  css  js  c++  java
  • [置顶] 【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();//结束游戏
    }

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

    效果图

          

  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3343532.html
Copyright © 2011-2022 走看看