鍍金池/ 教程/ Java/ 游戲場景過渡
游戲暫停和觸摸屏蔽
游戲場景過渡
碰撞檢測
跨平臺移植和廣告植入
批次渲染
觸摸事件和優(yōu)先級
背景音樂和音效
別急,先處理好CCScene和CCLayer的關(guān)系
自定義敵機精靈
UFO層特殊道具
主角的登場和幀動畫
引擎坐標系,錨點和背景滾動
分數(shù)的本地存儲
子彈層的處理
搞個飛機來玩玩

游戲場景過渡

游戲是實現(xiàn)了,但是如果有個歡迎界面和一個結(jié)束界面就更好了。

歡迎界面可以用于預(yù)加載一些資源,初始化數(shù)據(jù),顯示logo,copyright之類的東西,而結(jié)束畫面用于顯示游戲得分,以及返回游戲,退出游戲等等。

1.歡迎界面

本系列到這里,歡迎場景的建立應(yīng)該不用多說了。還是一樣的WelcomeLayer和WelcomeScene。

WelcomeLayer的init主要實現(xiàn)的功能有:

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);//重復(fù)2次
    CCCallFuncN* repeatdone=CCCallFuncN::create(this,callfuncN_selector(WelcomeLayer::loadingDone));//loadingDone用來轉(zhuǎn)換場景
    CCSequence* sequence=CCSequence::create(repeat,repeatdone);
    loading->runAction(sequence);

1.3.加載歷史最高分

    getHighestHistorySorce();

2.結(jié)束畫面

(1)GameOverLayer是結(jié)束畫面,它比較特殊的一點是create,我們給它傳個參數(shù),這個參數(shù)就是在游戲場景切換到結(jié)束場景傳遞的分數(shù)值。

    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)中間顯示本局分數(shù),左上角顯示歷史最高分,當切換到結(jié)束畫面時,分數(shù)做一個放大縮小的動畫。

    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)如果當前分數(shù)破紀錄,左上角歷史最高分要進行更新。

    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個場景。歡迎界面,游戲界面和游戲結(jié)束界面。它們的關(guān)系是:

    WelcomeScene→GameScene?GameOverScene

場景的切換我們使用

    CCDirector::sharedDirector()->replaceScene(CCScene* pSecne);//相關(guān)資源會進行銷毀

關(guān)于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調(diào)試的時候沒注意到這個問題,但是當移植到安卓的時候才發(fā)現(xiàn),按Back鍵竟然木有用,而Home鍵只能切換到主屏,也不能退出游戲。

還記得CCLayer從哪里繼承來的么?我們再看一遍:

    CCLayer : public CCNode, public CCTouchDelegate, public CCAccelerometerDelegate, public CCKeypadDelegate

最后的CCKeypadDelegate就是解決這個問題的方法。

在各個主場景的主層中重載

    virtual void keyBackClicked();//對應(yīng)back鍵
    virtual void keyMenuClicked();//對應(yīng)home鍵

在init中調(diào)用

    this->setKeypadEnabled(true);

keyBackClicked()的實現(xiàn)

    void GameOverLayer::keyBackClicked()
    {
        CCDirector::sharedDirector()->end();//結(jié)束游戲
    }

這一節(jié)感覺有點多啊。。。就這樣吧。

效果圖

http://wiki.jikexueyuan.com/project/cocos2d-x-getting-real/images/13.1.jpeg" alt="" />

http://wiki.jikexueyuan.com/project/cocos2d-x-getting-real/images/13.2.jpeg" alt="" />