`

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

 

我们首先需要在工程中添加一个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场景。

 

更多内容请关注最新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课堂微信公共平台

 

 

 

分享到:
评论

相关推荐

    cocos2d-x 场景切换

    《cocos2d-x场景切换详解》 在游戏开发或者应用设计中,场景切换是一个至关重要的环节,它决定了用户在不同界面之间的流畅体验。cocos2d-x作为一款广泛使用的2D游戏引擎,其场景管理功能强大且灵活,能够帮助开发者...

    迷失航线-Cocos2d-x项目实战-射击类游戏-关东升

    Cocos2d-x的Scheduler允许开发者定时调用函数执行游戏逻辑,如更新游戏状态、移动物体、发射子弹等。同时,事件监听器用于响应用户的触摸输入,实现飞机的移动和射击操作。 物理引擎在《迷失航线》中也扮演了重要...

    cocos2d-x场景切换源代码

    本教程将深入探讨如何在Cocos2d-x中实现场景切换,并通过提供的"SimpleGame源代码"进行实例解析。 首先,我们需要理解Cocos2d-x中的`Director`类是管理场景的核心组件。`Director`负责创建、显示和切换场景。在...

    cocos2d-x 游戏小demo

    【cocos2d-x 游戏小demo】是一款基于cocos2d-x框架开发的简易游戏示例,主要展示了如何运用这个强大的2D游戏引擎来创建一个基础的魔塔类游戏。cocos2d-x是一个跨平台的游戏开发库,支持iOS、Android、Windows等多...

    cocos2d-x默认第一个模板

    cocos2d-x的核心组件包括场景(Scene)、层(Layer)、精灵(Sprite)、动作(Action)和转换(Transition)等。这些组件共同构建了游戏的逻辑和视觉效果。场景是游戏的顶层容器,可以包含多个层;层则负责组织游戏的对象和...

    基于cocos2d-x的俄罗斯方块游戏源码

    2. **图形界面**:cocos2d-x提供了丰富的图形绘制API,包括精灵(Sprite)、层(Layer)、场景(Scene)等。在这个项目中,开发者会创建方块的精灵图片,设置合适的坐标和大小,实现游戏界面的布局。 3. **事件处理...

    Cocos2d-x之Lua核心编程 ,刘克男,杨雍著 ,P227

    《Cocos2d-x之Lua核心编程》这本书由刘克男和杨雍共同撰写,主要针对Cocos2d-x游戏引擎中的Lua编程进行深入讲解。Cocos2d-x是一款广泛使用的开源游戏开发框架,它支持多种语言,其中Lua以其轻量级、易学易用的特性,...

    Cocos2d-x 2.0的俄罗斯方块代码

    - **游戏循环**:在Cocos2d-x中,游戏循环是通过`scheduleUpdate`方法实现的,它会定期调用更新函数来处理游戏逻辑,如方块的移动、旋转、消除行等。 - **图形渲染**:Cocos2d-x提供了一个基于精灵(Sprite)的...

    Cocos2d-X 3.2 API 文档

    API文档是了解Cocos2d-X 3.2功能和方法的详细指南,其中包含了类库、函数、接口以及各种组件的全面介绍。CHM(Compiled HTML Help)格式使得这些信息能够以离线方式快速检索和查阅,对于开发者来说非常实用。如果...

    cocos2d-x游戏源码

    在cocos2d-x中,我们可以利用Scene对象来表示不同的关卡,通过Director类进行场景之间的切换。游戏数据,如关卡设计、敌人配置等,可以存储在JSON或XML文件中,然后在运行时动态加载,这样可以实现游戏内容的动态...

    Cocos2d-x 3.4 API离线文档

    Cocos2d-x是一款开源的游戏开发框架,广泛应用于2D游戏、实时渲染应用程序和其他互动内容的制作。3.4版本是其稳定且功能强大的一个版本,提供了丰富的API接口供开发者使用。这个“Cocos2d-x 3.4 API离线文档”包含了...

    cocos2d-x学习笔记\cocos2d-x学习笔记(17)--简单游戏实例1--双枪手

    cocos2d-x的`Director`类可以用来切换场景,例如在游戏开始、暂停、结束时切换不同的场景。我们可以定义多个状态(如游戏开始界面、主游戏场景、游戏结束界面),并根据用户操作来切换。 资源管理方面,cocos2d-x...

    Cocos2d-x之Lua核心编程 配套代码

    1. **Lua与Cocos2d-x的集成**:Cocos2d-x提供了Lua绑定,使得开发者可以使用Lua脚本来控制游戏逻辑和场景管理。通过lua-bindings或者tolua++,C++对象可以被映射到Lua,反之亦然,实现C++与Lua之间的无缝交互。 2. ...

    cocos2d-x游戏实例-简易动作游戏

    4. 分数系统:利用cocos2d-x的Label类显示分数,并通过计分函数实时更新。 5. 背景和场景管理:使用Scene、Layer、Sprite等组件构建游戏场景,实现背景滚动和场景切换。 6. 音效和音乐:集成AudioEngine模块,播放...

    cocos2d-x贪吃蛇

    通过本文介绍,读者不仅能够了解到如何使用Cocos2d-x构建贪吃蛇游戏,还能深入理解Cocos2d-x框架的基本原理及其在游戏开发中的应用。希望本文能够为初学者提供一定的指导,同时也为有一定基础的开发者提供更多灵感和...

    Cocos2d-X 3.4版-游戏继续,游戏重新开始,回到主界面的实现《赵云要格斗》

    总结起来,实现Cocos2d-X 3.4中的游戏继续、重新开始和返回主界面功能,需要对游戏状态进行管理和存储,创建适当的场景切换逻辑,并处理用户输入事件。通过深入理解Cocos2d-X的框架和API,开发者能够构建出富有交互...

    cocos2d-x高仿捕鱼达人实例分析(四)

    在Cocos2d-x中,Layer是场景(Scene)的基础组成部分,用于承载游戏的各种元素。GameLayer是专门为这个游戏设计的一个自定义Layer,它负责管理游戏的主要逻辑,比如玩家操作、物体碰撞检测、得分计算等。 在游戏...

    cocos2d-x-3.17.2

    cocos2d-x 提供了丰富的动作和动画库,如旋转、缩放、平移等基本动作,以及序列动作、缓动函数等高级功能,使开发者能够轻松创建出丰富的动态效果。 五、脚本支持 除了原生C++接口外,cocos2d-x 还支持Lua和...

    cocos2d-x实例——场景自动切换

    总的来说,Cocos2d-x提供的场景管理和动作系统为我们提供了灵活的工具来实现各种场景切换的效果。通过回调函数,我们可以轻松地控制何时以及如何切换场景;借助动作系统,我们可以创造出丰富的过渡动画,提升用户...

    cocos2d-x_学习文档

    在cocos2d-x的学习过程中,首先我们需要...在深入学习cocos2d-x的过程中,你需要掌握场景和层的概念,理解设备方向的处理,熟悉动作和事件系统,以及有效地管理和使用游戏资源,这些都是构建游戏基础架构的关键知识点。

Global site tag (gtag.js) - Google Analytics