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代码例如以下:

    auto sc = Setting::createScene();
    Director::getInstance()->replaceScene(sc);

    当中的Setting是下一个要切换的场景。使用pushScene代码例如以下:

    auto sc = Setting::createScene();
    Director::getInstance()->pushScene(sc);

    从Setting场景回到上一个场景使用代码例如以下:

    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中的重要代码例如以下:

    bool HelloWorld::init()
    {  
       if ( !Layer::init() )
       {
           return false;
       }
       
       Size visibleSize = Director::getInstance()->getVisibleSize();
       Point origin = Director::getInstance()->getVisibleOrigin();
     
       Sprite *bg = Sprite::create("background.png");
       bg->setPosition(Point(origin.x + visibleSize.width/2,
                                 origin.y +visibleSize.height /2));
       this->addChild(bg);
     
        //開始精灵
       Sprite *startSpriteNormal = Sprite::create("start-up.png");
       Sprite *startSpriteSelected =Sprite::create("start-down.png");
     
        MenuItemSprite*startMenuItem = MenuItemSprite::create(startSpriteNormal,
                                           startSpriteSelected,
                       CC_CALLBACK_1(HelloWorld::menuItemStartCallback,this));
        startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700,170)));
       
        //设置图片菜单
       MenuItemImage *settingMenuItem = MenuItemImage::create(
                                "setting-up.png",
                                "setting-down.png",
                                     CC_CALLBACK_1(HelloWorld::menuItemSettingCallback,this));
        settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480,400)));
       
        //帮助图片菜单
       MenuItemImage *helpMenuItem = MenuItemImage::create(
                                 "help-up.png",
                                "help-down.png",
                                     CC_CALLBACK_1(HelloWorld::menuItemHelpCallback,this));   
        helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860,480)));
     
        Menu*mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL);        
        mu->setPosition(Point::ZERO);
        this->addChild(mu);
       
       return true;
    }
     
    voidHelloWorld::menuItemSettingCallback(Ref* pSender)                                                    ①
    {  
        autosc = Setting::createScene();                                                                                                     ②
        //Director::getInstance()->replaceScene(sc);                                                                                 ③
        Director::getInstance()->pushScene(sc);                                                                              ④
    }
     
    void HelloWorld::menuItemHelpCallback(Ref*pSender)
    {
       MenuItem* item = (MenuItem*)pSender;
        log("TouchHelp %p", item);
    }
     
    void HelloWorld::menuItemStartCallback(Ref*pSender)
    {
       MenuItem* item = (MenuItem*)pSender;
        log("TouchStart %p", item);
    }

    上述代码中的第①行定义的函数menuItemSettingCallback,是在用户点击“游戏设置”菜单时候回调。第②行代码是创建设置创建对象。

    第③行是使用replaceScene函数进行场景切换。

    第④行代码是pushScene函数进行场景切换。

    HelloWorldScene.cpp中的重要代码例如以下:

    bool Setting::init()
    {
       if ( !Layer::init() )
       {
           return false;
       }
       
       Size visibleSize = Director::getInstance()->getVisibleSize();
       Point origin = Director::getInstance()->getVisibleOrigin();
     
       Sprite *bg = Sprite::create("setting-back.png");
       bg->setPosition(Point(origin.x + visibleSize.width/2,
                                 origin.y +visibleSize.height /2));
       this->addChild(bg);
     
        //音效
       auto soundOnMenuItem = MenuItemImage::create(
                                "on.png",
                                 "on.png");
       auto soundOffMenuItem = MenuItemImage::create(
                                "off.png",
                                "off.png");
       
       auto soundToggleMenuItem = MenuItemToggle::createWithCallback(
                      CC_CALLBACK_1(Setting::menuSoundToggleCallback,this),
                                                                                soundOnMenuItem,
                                                                                soundOffMenuItem,
                                                                                NULL);
        soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818,220)));
       
       //音乐
       auto musicOnMenuItem  =MenuItemImage::create(
                                "on.png",
                                "on.png");
        automusicOffMenuItem  =MenuItemImage::create(
                                "off.png",
                                "off.png");
       auto musicToggleMenuItem = MenuItemToggle::createWithCallback(
                               CC_CALLBACK_1(Setting::menuMusicToggleCallback,this),
                                                       musicOnMenuItem,
                                                       musicOffMenuItem,
                                                        NULL);
        musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818,362)));
     
       //Okbutton
        autookMenuItem  = MenuItemImage::create(
                                "ok-down.png",
                                "ok-up.png",
                                     CC_CALLBACK_1(Setting::menuOkCallback, this));
     
        okMenuItem->setPosition(Director::getInstance()->convertToGL(Point(600,510)));
     
       Menu* mn = Menu::create(soundToggleMenuItem,
                                                                       musicToggleMenuItem,okMenuItem,NULL);
        mn->setPosition(Point::ZERO);
       this->addChild(mn);
       
       return true;
    }
     
    void Setting::menuOkCallback(Ref*pSender)                                                                                   ①
    {
        Director::getInstance()->popScene();                                                                                             ②
    }
    void Setting::menuSoundToggleCallback(Ref*pSender)
    {}
    void Setting::menuMusicToggleCallback(Ref*pSender)
    {}

    上述代码中的第①行定义的函数menuOkCallback,是在用户在设置场景点击“OK”菜单时候回调。

    第②行代码是使用popScene函数返回HelloWorld场景。

    很多其它内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
    本书交流讨论站点:http://www.cocoagame.net
    很多其它精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
    欢迎加入Cocos2d-x技术讨论群:257760386


    《Cocos2d-x实战 C++卷》现已上线。各大商店均已开售:

    京东:http://item.jd.com/11584534.html

    亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

    当当:http://product.dangdang.com/23606265.html

    互动出版网:http://product.china-pub.com/3770734

    《Cocos2d-x实战 C++卷》源代码及样章下载地址:

    源代码下载地址:http://51work6.com/forum.php?

    mod=viewthread&tid=1155&extra=page%3D1 

    样章下载地址:http://51work6.com/forum.php?

    mod=viewthread&tid=1157&extra=page%3D1

    欢迎关注智捷iOS课堂微信公共平台


     

  • 相关阅读:
    WCF之Binding
    Coding获取站点中被任何用户标记为I like it的项
    CSS兼容性
    CSS Hacker
    putty配置
    css中fontfamily的中文字体
    Linux下 zip 和 unzip的用法
    搭建WebService服务 【转】
    【基于spark IM 的二次开发笔记】第一天 各种配置
    在DirectX环境下读入3DS模型并显示
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6830582.html
Copyright © 2011-2022 走看看