• [置顶] 【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();//结束游戏
    }

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

    效果图

          

  • 相关阅读:
    SQL Server数据库读写分离提高并发性
    静态方法与实例化方法区别
    消息队列MQ对比
    【Python】socket模块应用
    【Matplotlib】利用Python进行绘图
    【Git】简单使用
    【HTTPS】自签CA证书 && nginx配置https服务
    【HTTP】 认证和单点登录 【瞎写的…】
    【Linux】防火墙与CentOS中的iptables
    【Ansible】的python api
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3343532.html
Copyright © 2020-2023  润新知