Cocos2d-x場景切換相關函數介紹

場景切換是經過導演類Director實現的,其中的相關函數以下:php

runWithScene(Scene* scene)。該函數能夠運行場景。只能在啓動第一個場景時候調用該函數。若是已經有一個場景運行狀況下則不能調用該函數。html

replaceScene(Scene* scene)。切換到下一個場景。用一個新的場景替換當前場景,當前場景被終端釋放。函數

pushScene(Scene* scene)。切換到下一個場景。將當前場景掛起放入到場景堆棧中,而後再切換到下一個場景中。網站

void popScene()。與pushScene配合使用,能夠回到上一個場景。this

void popToRootScene()。與pushScene配合使用,能夠回到根場景。spa

咱們須要注意replaceScene和pushScene使用的區別。replaceScene會釋放和銷燬場景,若是須要保持原來場景的狀態,replaceScene函數不適合。pushScene並不會釋放和銷燬場景,原來場景的狀態能夠保持,可是場景不能放太多的場景對象。.net

使用replaceScene代碼以下:code

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片orm

  1. auto sc = Setting::createScene();  htm

  2. Director::getInstance()->replaceScene(sc);  


其中的Setting是下一個要切換的場景。使用pushScene代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. auto sc = Setting::createScene();  

  2. Director::getInstance()->pushScene(sc);  


從Setting場景回到上一個場景使用代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. Director::getInstance()->popScene();  


下面咱們經過一個實例場景切換相關函數,以下圖所示有兩個場景:HelloWorld和Setting(設置)。在HelloWorld場景點擊「遊戲設置」菜單能夠切換到Setting場景,在Setting場景中點擊「OK」菜單能夠返回到HelloWorld場景。


咱們首先須要在工程中添加一個Setting場景(SettingScene.cpp和SettingScene.h),以下圖所示,右鍵點擊HelloWorld工程中Classes文件夾,在彈出菜單中選擇「添加」→「新建項」:


彈出對話框以下圖所示,在名稱中輸入「SettingScene.cpp」,並選擇保存文件位置,而後點擊「添加」按鈕建立SettingScene.cpp。使用一樣的方法建立SettingScene.h。


下面咱們看看代碼部分,HelloWorldScene.cpp中的重要代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. bool HelloWorld::init()  

  2. {    

  3.    if ( !Layer::init() )  

  4.    {  

  5.        return false;  

  6.    }  

  7.      

  8.    Size visibleSize = Director::getInstance()->getVisibleSize();  

  9.    Point origin = Director::getInstance()->getVisibleOrigin();  

  10.    

  11.    Sprite *bg = Sprite::create("background.png");  

  12.    bg->setPosition(Point(origin.x + visibleSize.width/2,  

  13.                              origin.y +visibleSize.height /2));  

  14.    this->addChild(bg);  

  15.    

  16.     //開始精靈  

  17.    Sprite *startSpriteNormal = Sprite::create("start-up.png");  

  18.    Sprite *startSpriteSelected =Sprite::create("start-down.png");  

  19.    

  20.     MenuItemSprite*startMenuItem = MenuItemSprite::create(startSpriteNormal,  

  21.                                        startSpriteSelected,  

  22.                    CC_CALLBACK_1(HelloWorld::menuItemStartCallback,this));  

  23.     startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700,170)));  

  24.      

  25.     //設置圖片菜單  

  26.    MenuItemImage *settingMenuItem = MenuItemImage::create(  

  27.                             "setting-up.png",  

  28.                             "setting-down.png",  

  29.                                  CC_CALLBACK_1(HelloWorld::menuItemSettingCallback,this));  

  30.     settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480,400)));  

  31.      

  32.     //幫助圖片菜單  

  33.    MenuItemImage *helpMenuItem = MenuItemImage::create(  

  34.                              "help-up.png",  

  35.                             "help-down.png",  

  36.                                  CC_CALLBACK_1(HelloWorld::menuItemHelpCallback,this));     

  37.     helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860,480)));  

  38.    

  39.     Menu*mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL);          

  40.     mu->setPosition(Point::ZERO);  

  41.     this->addChild(mu);  

  42.      

  43.    return true;  

  44. }  

  45.    

  46. voidHelloWorld::menuItemSettingCallback(Ref* pSender)                                                    ①  

  47. {    

  48.     autosc = Setting::createScene();                                                                                                     ②  

  49.     //Director::getInstance()->replaceScene(sc);                                                                                 ③  

  50.     Director::getInstance()->pushScene(sc);                                                                              ④  

  51. }  

  52.    

  53. void HelloWorld::menuItemHelpCallback(Ref*pSender)  

  54. {  

  55.    MenuItem* item = (MenuItem*)pSender;  

  56.     log("TouchHelp %p", item);  

  57. }  

  58.    

  59. void HelloWorld::menuItemStartCallback(Ref*pSender)  

  60. {  

  61.    MenuItem* item = (MenuItem*)pSender;  

  62.     log("TouchStart %p", item);  

  63. }  


上述代碼中的第①行定義的函數menuItemSettingCallback,是在用戶點擊「遊戲設置」菜單時候回調。第②行代碼是建立設置建立對象。第③行是使用replaceScene函數進行場景切換。第④行代碼是pushScene函數進行場景切換。

HelloWorldScene.cpp中的重要代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. bool Setting::init()  

  2. {  

  3.    if ( !Layer::init() )  

  4.    {  

  5.        return false;  

  6.    }  

  7.      

  8.    Size visibleSize = Director::getInstance()->getVisibleSize();  

  9.    Point origin = Director::getInstance()->getVisibleOrigin();  

  10.    

  11.    Sprite *bg = Sprite::create("setting-back.png");  

  12.    bg->setPosition(Point(origin.x + visibleSize.width/2,  

  13.                              origin.y +visibleSize.height /2));  

  14.    this->addChild(bg);  

  15.    

  16.     //音效  

  17.    auto soundOnMenuItem = MenuItemImage::create(  

  18.                             "on.png",  

  19.                              "on.png");  

  20.    auto soundOffMenuItem = MenuItemImage::create(  

  21.                             "off.png",  

  22.                             "off.png");  

  23.      

  24.    auto soundToggleMenuItem = MenuItemToggle::createWithCallback(  

  25.                   CC_CALLBACK_1(Setting::menuSoundToggleCallback,this),  

  26.                                                                             soundOnMenuItem,  

  27.                                                                             soundOffMenuItem,  

  28.                                                                             NULL);  

  29.     soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818,220)));  

  30.      

  31.    //音樂  

  32.    auto musicOnMenuItem  =MenuItemImage::create(  

  33.                             "on.png",  

  34.                             "on.png");  

  35.     automusicOffMenuItem  =MenuItemImage::create(  

  36.                             "off.png",  

  37.                             "off.png");  

  38.    auto musicToggleMenuItem = MenuItemToggle::createWithCallback(  

  39.                            CC_CALLBACK_1(Setting::menuMusicToggleCallback,this),  

  40.                                                    musicOnMenuItem,  

  41.                                                    musicOffMenuItem,  

  42.                                                     NULL);  

  43.     musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818,362)));  

  44.    

  45.    //Ok按鈕  

  46.     autookMenuItem  = MenuItemImage::create(  

  47.                             "ok-down.png",  

  48.                             "ok-up.png",  

  49.                                  CC_CALLBACK_1(Setting::menuOkCallback, this));  

  50.    

  51.     okMenuItem->setPosition(Director::getInstance()->convertToGL(Point(600,510)));  

  52.    

  53.    Menu* mn = Menu::create(soundToggleMenuItem,  

  54.                                                                    musicToggleMenuItem,okMenuItem,NULL);  

  55.     mn->setPosition(Point::ZERO);  

  56.    this->addChild(mn);  

  57.      

  58.    return true;  

  59. }  

  60.    

  61. void Setting::menuOkCallback(Ref*pSender)                                                                                   ①  

  62. {  

  63.     Director::getInstance()->popScene();                                                                                             ②  

  64. }  

  65. void Setting::menuSoundToggleCallback(Ref*pSender)  

  66. {}  

  67. void Setting::menuMusicToggleCallback(Ref*pSender)  

  68. {}  


上述代碼中的第①行定義的函數menuOkCallback,是在用戶在設置場景點擊「OK」菜單時候回調。第②行代碼是使用popScene函數返回HelloWorld場景。

更多內容請關注Cocos2d-x系列圖書《Cocos2d-x實戰(卷Ⅰ):C++開發》

本書交流討論網站:http://www.cocoagame.net

歡迎加入cocos2d-x技術討論羣:25776038六、327403678

相關文章
相關標籤/搜索