离线下载
PDF版 ePub版

偶尔e网事 · 更新于 2018-11-28 11:00:43

游戏场景过渡

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

欢迎界面可以用于预加载一些资源,初始化数据,显示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();//结束游戏
    }

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

效果图