場景切換就是轉變遊戲進行之流程介面,以專業術語來說就是改變狀態,用較通俗的話說就是改變畫面。切入正題前,在cocos2d引擎中有幾個重要概念須先建立好才能掌控遊戲之運作模式,分別是導演、場景、佈景和人物角色(在之前blog文章中未詳載說明,在此補述),如下:。
u   導演(CCDirector):此類是遊戲主要之組織者,其扮演制定規則讓遊戲內的場景、佈景和人物角色要如何依設定模式作有序的運行。
u   攝影機(CCCamera:在每個節點(CCNode)都需要使用攝像機,當節點發生縮放、旋轉和位置變化時,都需要遮蓋攝影機,讓這個節點通過攝影機重新渲染。
u   場景(CCScene:在遊戲裡場景就是關卡之概念,而每道關卡則由背景和人物構成其顯示介面。
u   圖層(CCLayer:一個場景的呈現是由圖層疊合出來的,可將背景及人物規劃分屬於不同圖層中,此即為場景分層之層次概念。
u   人物(CCSprite:專業術語稱之為精靈,其包含遊戲中角色()及圖像()…等元件之定義。
u   動作(CCAction:定義人物(CCSprite)具有之行為。
筆者在此用大家比較能接受的白話文來說明遊戲之整體運作流程,撰寫一個遊戲就像是導出一齣戲,主控者是掌控戲劇運作之導演(CCDirector),依劇情(CCNode)之安排叫出所有要出現的演員(CCSprite)在某個背景(CCSPrite)及某些道具(CCSprite)之襯托下完成一個表演流程(CCScene)(※記得,凡是該要呈現出來的東西均是CCSprite之定義),將這些人、物依屬性分別定義在不同層別(CCLayer)中,再則演員該如何表演及其它配合會動之輔助物件則須為其加上動作(CCAction),若劇情流程中有遠近之取景安排則以攝影機(CCCamera)來操作,導一齣戲要一個團隊(team),同樣地,一個遊戲製作也要成立多人才能運行(但通常開發小遊戲都由負責程式編寫的程式員一人獨撐大局,筆者就是這樣全包,校長兼撞鐘,沒別的資源只好這樣,不過可學到很多的~~~”技術”),剛開始都由一個人統包全權負責(通常就是遊戲開發的那個人---就是”)-------------為寫這一段如何將遊戲開發結合拍戲流程,想了很久,細胞耗損不少,還是完成了。
接下來,請站在一個遊戲開發的程序員角色來看後續工作(筆者都是這樣處理的)。以場景而言,一個遊戲通常需要主功能表場景  設置場景 關於場景 遊戲進行場景,也就是具有多個場景,故才須作場景切換。以《冒險島》遊戲為例,這個遊戲就有 很多層,背景層、障礙物層、任務怪物層…等等,分層的概念一出來,思路比較清晰許多,每個場景可有多個層組成的。
而每個層中會有很多的《個體》,具體地說比如怪物層中每個怪物都是一個單獨的個體,稱之為人物精靈,遊戲中不可能只有一個怪物,故每個層可有多個個體。每個個體都具有自己的特性,比如會跳舞、攻擊等行為,此現象稱之為 動作~ 每個個體可有很多組合動作 ..
至於在cocos2d-x中支援很多種特效狀態之場景切換,慢慢解析下列代碼:(要看出其精髓何在才能學會該有技巧)
首先是Helloworld類中之場景創建函數
CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do
    {
        // 'scene' is an autorelease object
        scene = CCScene::node();  //創建場景
        CC_BREAK_IF(! scene);

        // 'layer' is an autorelease object
        HelloWorld *layer = HelloWorld::node();  //創建層
        CC_BREAK_IF(! layer);

        // add layer as a child to scene
        scene->addChild(layer);  //添加層到場景中顯示,當然可以是多個層
    } while (0);

    // return the scene
    return scene;
}
上面代碼就是創建了Helloworld類這個場景,然後再創建了一個層,之後再把這個層添加到場景中顯示。
下面代碼是在init()函數中添加按鈕的代碼,當添加了一個按鈕後,還須修改它相對的調用函數:
CCMenuItemImage *pCloseItem2 = CCMenuItemImage::itemFromNormalImage(
                                "play1.png",
                                "play2.png",
                                this,
                                menu_selector(HelloWorld::menuTestCallback));  // HelloWorld::menuTestCallback是自訂函數名稱
                     CC_BREAK_IF(! pCloseItem2);
                     pCloseItem2->setPosition(ccp(s.width/2, s.height-100));  //設置按鈕位置

        CCMenu* pMenu = CCMenu::menuWithItems(pCloseItem2, NULL);  //設置功能表項目
        pMenu->setPosition(CCPointZero);
        CC_BREAK_IF(! pMenu);

        this->addChild(pMenu, 1);  //添加菜單,後面1表示層次(數字愈小其層愈前面)
上面是init()的完全代碼,主要就是創建了一個按鈕,然後放入功能表中,之後再添加功能表進入場景中。下面代碼則是關鍵的切換特效實現代碼... 
void HelloWorld::menuTestCallback(CCObject* pSender)
{
  CCScene *scene = HelloWorld::scene(); //指定欲切換至那一場景,此以本身這個場景為例,但可看出切換之過度特效
     CCDirector::sharedDirector()->replaceScene(CCTransitionJumpZoom::transitionWithDuration(1.2f,scene));
 
   // transitionWithDuration(t, s)這兩個參數,第一個是時間,格式為 1.2f類似的浮點數;第二個是需要切換至的場景
}
一般使用正常無過度特效之場景切換,可用CCDirector::sharedDirector()->replaceScene(scene);即可,而使用CCTransitionJumpZoom類就是切換效果!可替換這個效果以展現其它各種特效!具體之可用效果列舉如下:
Ø   CCTransitionJumpZoom::transitionWithDuration(t, s);//跳躍式,本場景先會縮小,然後跳躍進來
Ø   CCTransitionFade::transitionWithDuration(t, s);//淡出淡入,原場景淡出,新場景淡入
Ø   CCTransitionFade::transitionWithDuration(t, s, ccWHITE);//如果上一個的函數,帶3個參數,則第三個參數就是淡出淡入的顏色
Ø   CCTransitionFlipX::transitionWithDuration(t, s, kOrientationLeftOver);//x軸左翻
Ø   CCTransitionFlipX::transitionWithDuration(t, s, kOrientationRightOver);//x軸右翻
Ø   CCTransitionFlipY::transitionWithDuration(t, s, kOrientationUpOver);//y軸上翻
Ø   CCTransitionFlipY::transitionWithDuration(t, s, kOrientationDownOver);//y軸下翻
Ø   CCTransitionFlipAngular::transitionWithDuration(t, s, kOrientationLeftOver);//有角度轉的左翻
Ø   CCTransitionFlipAngular::transitionWithDuration(t, s, kOrientationRightOver);//有角度轉的右翻
Ø   CCTransitionZoomFlipX::transitionWithDuration(t, s, kOrientationLeftOver);//帶縮放效果x軸左翻
Ø   CCTransitionZoomFlipX::transitionWithDuration(t, s, kOrientationRightOver);//帶縮放效果x軸右翻
Ø   CCTransitionZoomFlipY::transitionWithDuration(t, s, kOrientationUpOver);//帶縮放效果y軸上翻
Ø   CCTransitionZoomFlipY::transitionWithDuration(t, s, kOrientationDownOver);//帶縮放效果y軸下翻 
Ø   CCTransitionZoomFlipAngular::transitionWithDuration(t, s, kOrientationLeftOver);//帶縮放效果/有角度轉的左翻
Ø   CCTransitionZoomFlipAngular::transitionWithDuration(t, s, kOrientationRightOver);//帶縮放效果有角度轉的右翻
Ø   CCTransitionShrinkGrow::transitionWithDuration(t, s);//交錯換
Ø   CCTransitionRotoZoom::transitionWithDuration(t, s);//轉角換
Ø   CCTransitionMoveInL::transitionWithDuration(t, s);//新場景從左移入覆蓋
Ø   CCTransitionMoveInR::transitionWithDuration(t, s);//新場景從右移入覆蓋
Ø   CCTransitionMoveInT::transitionWithDuration(t, s);//新場景從上移入覆蓋
Ø   CCTransitionMoveInB::transitionWithDuration(t, s);//新場景從下移入覆蓋
Ø   CCTransitionSlideInL::transitionWithDuration(t, s);//場景從左移入推出原場景
Ø   CCTransitionSlideInR::transitionWithDuration(t, s);//場景從右移入推出原場景
Ø   CCTransitionSlideInT::transitionWithDuration(t, s);//場景從上移入推出原場景
Ø   CCTransitionSlideInB::transitionWithDuration(t, s);//場景從下移入推出原場景以下三個需要檢測opengl版本是否支援
Ø   CCConfiguration::sharedConfiguration()->getGlesVersion() <= GLES_VER_1_0如果為真則為不支持
Ø   CCTransitionCrossFade::transitionWithDuration(t,s);//淡出淡入交叉,同時進行
Ø   CCTransitionRadialCCW::transitionWithDuration(t,s);//順時針切入
Ø   CCTransitionRadialCW::transitionWithDuration(t,s);//逆時針切入以下兩個需要先設置攝像機,使用
Ø   CCDirector::sharedDirector()->setDepthTest(true);
Ø   CCTransitionPageTurn::transitionWithDuration(t, s, false);//翻頁,前翻
Ø   CCTransitionPageTurn::transitionWithDuration(t, s, true);//翻頁,後翻
Ø   CCTransitionFadeTR::transitionWithDuration(t, s);//向右上波浪
Ø   CCTransitionFadeBL::transitionWithDuration(t, s);//向左下波浪
Ø   CCTransitionFadeUp::transitionWithDuration(t, s);//向上百葉窗
Ø   CCTransitionFadeDown::transitionWithDuration(t, s);//向下百葉窗
Ø   CCTransitionTurnOffTiles::transitionWithDuration(t, s);//隨機小方塊
Ø   CCTransitionSplitRows::transitionWithDuration(t, s);//按行切
Ø   CCTransitionSplitCols::transitionWithDuration(t, s);//按列切

0 意見: