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场景。

我们首先需要在工程中添加一个Setting场景SettingScene.cpp和SettingScene.h如下图所示右键点击HelloWorld工程中Classes文件夹在弹出菜单中选择“添加”→“新建项”

弹出对话框如下图所示在名称中输入“SettingScene.cpp”并选择保存文件位置然后点击“添加”按钮创建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)));

   //Ok按钮
    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课堂微信公共平台

 

时间: 2024-10-27 20:37:58

Cocos2d-x场景切换相关函数介绍的相关文章

cocos2d场景切换在安卓系统上显示黑屏了???

问题描述 cocos2d场景切换在安卓系统上显示黑屏了??? 整个project在vs下调试运行没有问题,场景动画后显示第二个场景,但生成apk文件后 安卓上主菜单能显示,点击开始按钮,场景过渡动画能显示出来,背景音乐也能播放, 但场景二显示不出来了,显示黑屏,求大神指点. 解决方案 http://www.cocoachina.com/bbs/read.php?tid=234748

Unity3d之无缝地形场景切换–解决方法和代码

当我们开发一个大型项目的时候-会遇到这样的问题(地形场景的切换)这个只是字面意思-并不是重场景1的100 100 100坐标一下切换到场景2的100 100 100坐标这样的方法--(如果您以为是这样的技术和代码)那就不用看了.这个技术的实质意义是为了解决--多地形场景带来的大量内存占用问题-举个我的例子-我的测试项目是1013张绘制地形--在不用上面的技术情况下-占用了我4.2G的内存.想想下-如果一个大型的游戏直接这么运行的话)一下就会带来5-8G的内存占用--这个游戏还能玩吗? 下面让我们

Cocos2d-x-v3场景切换

Cocos2d-x-v3场景切换         cocos2d中场景的切换采用的是包装的思想,通过创建一个专场效果类,将需要专场的场景进行包装.代码示例如下: ? 1 2     auto * scene = OtherScene::createScene();//创建一个场景     Director::getInstance()->replaceScene(TransitionFlipX::create(1, scene));//进行包装切换,第一个参数为切换时间,第二个为切换的场景 引擎

React-native 尝鲜计划-场景切换(Navigator)

在上篇文章<react-native 尝鲜计划-环境搭建>中讲述了react-native 的环境搭建,并初始化了 react-native 的第一个项目.如果你已经完成了上一篇文章的学习,并且成功调试第一个 "hello world" 项目,你已成功地经迈出第一步,接下来的学习就会顺利得多.在我成功调试出第一个项目之后,连蒙带差的走读了下原生代码和 index.android.js 代码,脑海里有很多疑问,第一个疑问就是:react-native 如何做多个页面跳转的?相

8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画

 1 添加场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadialCW CCTransitionProgressHorizontal CCTransitionProgressVertical CCTransitionProgressInOut CCTransitionProgressOutIn CCTransitionCrossFade CCTransitionF

Cocos2d-x UI开发之场景切换代码实例_C 语言

cocos2d-x中的场景切换是通过导演类调用相应的方法完成的,可以通过CCDirector::sharedDirector()->replaceScene()方法切换场景,参数是要切换的新场景,这种方法会释放掉旧的场景.通过pushScene()切换则是将旧的场景压入到栈中,以便通过popScene()函数出栈,继续运行原场景.刚开始程序启动的时候通过runWithScene()运行一个新的场景.下面通过代码来说明.单击下图可以查看效果. 这次代码一共建立了俩个场景,一个是原来的hellowo

Cocos2d-x Lua中多场景切换生命周期

在多个场景切换时候,场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期.多个场景切换时候分为几种情况:情况1,使用pushScene函数从实现GameScene场景进入SettingScene场景.情况2,使用replaceScene函数实现从GameScene场景进入SettingScene场景.情况3,使用popScene函数从实现SettingScene场景回到GameScene场景.我们参考GameScene重写SettingScene的中几个生命周期函数,代码如下: func

Cocos2d-x多场景切换生命周期

在多个场景切换时候场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期. 多个场景切换时候分为几种情况 情况1使用pushScene函数从实现HelloWorld场景进入Setting场景. 情况2使用replaceScene函数实现从HelloWorld场景进入Setting场景. 情况3使用popScene函数从实现Setting场景回到HelloWorld场景.   我们参考HelloWorld重写Setting层的中几个生命周期函数代码如下 bool Setting::init(

JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍_javascript技巧

cookie是网站设计者放置在客户端(浏览器)的小文本文件,cookie不仅能够实现保存密码功能,还可以通过cookie保存最近浏览记录增加用户体验. 在登录界面添加记住密码功能,我首先想到的是在java后台中调用cookie存放账号密码,大致如下: HttpServletRequest request HttpServletResponse response Cookie username = new Cookie("username ","cookievalue"