zoukankan      html  css  js  c++  java
  • Cocos2d-x场景变化相关功能介绍

    现场由导演级交换机Director实现。之间的相关的功能,如下面:

    runWithScene(Scene* scene)。该函数能够执行场景。仅仅能在启动第一个场景时候调用该函数。假设已经有一个场景执行情况下则不能调用该函数。

    replaceScene(Scene* scene)。

    切换到下一个场景。

    用一个新的场景替换当前场景。当前场景被终端释放。

    pushScene(Scene* scene)。切换到下一个场景。将当前场景挂起放入到场景堆栈中,然后再切换到下一个场景中。

    void popScene()。与pushScene配合使用,能够回到上一个场景。

    void popToRootScene()。与pushScene配合使用,能够回到根场景。

    我们须要注意replaceScene和pushScene使用的差别。

    replaceScene会释放和销毁场景,假设须要保持原来场景的状态,replaceScene函数不适合。

    pushScene并不会释放和销毁场景,原来场景的状态能够保持。可是场景不能放太多的场景对象。

    使用replaceScene代码例如以下:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. auto sc = Setting::createScene();  
    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场景。


    我们首先须要在project中加入一个Setting场景(SettingScene.cpp和SettingScene.h),例如以下图所看到的,右键点击HelloWorldproject中Classes目录,在弹出菜单中选择“加入”→“新建项”:


    弹出对话框例如以下图所看到的。在名称中输入“SettingScene.cpp”。并选择保存文件位置,然后点击“加入”button创建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.    //Okbutton  
    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. {}  

    在第一代码①行-defined功能menuOkCallback。用户设置场景中点击“OK”当菜单回调。文章②的代码行popScene该函数返回HelloWorld幕后。

  • 相关阅读:
    Leetcode 214. Shortest Palindrome
    Leetcode 5. Longest Palindromic Substring
    windows环境下MySQL-5.7.12-winx64下载安装与配置
    随机森林(Random Forests)
    机器学习基石笔记3——在何时可以使用机器学习(3)
    Linux服务器配置---ssh配置
    Linux基础命令---more
    Linux服务器---流量监控ntop
    Linux基础命令---gunzip
    Linux服务器---ssh登录
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4739276.html
Copyright © 2011-2022 走看看