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场景。
Cocos2d-x场景切换相关函数介绍的更多相关文章
- [cocos2d]场景切换以及切换进度显示
本文主要分两个部分叙述,第一是场景切换,第二是场景切换的进度显示. 一.场景切换 参考learn-iphone-and-ipad-cocos2d-game-development 第五章内容 coco ...
- cocos2d 场景切换和弹出场景、收回场景
场景弹出收回很简单 用以下代码在任意一个地方显示“设置场景”: [[CCDirector sharedDirector] pushScene:[Settings scene]]; 如果你身处“设置场景 ...
- cocos2d-x开发记录:二,基本概念(导演,场景,层和精灵,场景切换,效果)
四,Director Scene Layer和Sprite(导演,场景,层和精灵) 1.Scenes(场景) 一个场景 (用CCScene对象实现)相当于APP工作流的独立部分.一些人也喜欢叫做“屏幕 ...
- 【Cocos2d-x 3.x】 场景切换生命周期、背景音乐播放和场景切换原理与源码分析
大部分游戏里有很多个场景,场景之间需要切换,有时候切换的时候会进行背景音乐的播放和停止,因此对这块内容进行了总结. 场景切换生命周期 场景切换用到的函数: bool Setting::init() { ...
- JavaScript强化教程 -- cocosjs场景切换
场景切换 在main.js,将StartScene作为我们初始化运行的场景,代码如下: cc.LoaderScene.preload(g_resources, function () { cc.dir ...
- Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源码分析
上一章我们分析了Scene与Layer相关类的源码,对Cocos2d-x的场景有了初步了解,这章我们来分析一下场景变换TransitionScene源码. 直接看TransitionScene的定义 ...
- cocos进阶教程(3)Cocos2d-x多场景切换生命周期
在多个场景切换时候,场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期. 多个场景切换时候分为几种情况: 情况1,使用pushScene函数从实现HelloWorld场景进入Setting场 ...
- Unity 中场景切换
Unity游戏开发中,单个Scene解决所有问题似乎不可能,那么多个Scene之间的切换是必然存在.如果仅仅是切换,似乎什么都好说,但是在场景比较大的时候不想让玩家等待加载或者说场景与场景之间想通过一 ...
- 小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载四(场景切换)
作为一款真正有使用价值的应用,首先应该至少有两个页面,通过页面的切换来实现更多的交互.比如手机人人网,打开以后先是进入登录页面,登录后会有新鲜事,然后拉开左边的面板,能看到相册.悄悄话.应用之类的其他 ...
随机推荐
- HDU 1695 GCD 容斥
GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 Description Given 5 integers: a, b, c, d, k ...
- JavaEE系列之(三)JDBC操作MySQL数据库
一.JDBC简介 JDBC(Java Data Base Connectivity)java数据库连接 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库 ...
- jQuery 的 live() 方法对 hover 事件的处理
因为hover不是标准的事件,因此无法直接使用live进行处理,故使用以下方法代替,效果一样 <script type="text/javascript"> $(&qu ...
- THD 变量存入threads中
http://blog.csdn.net/gapaul/article/details/12047497 http://ourmysql.com/archives/930
- Ubuntu下安装FTP服务及使用(VSFTPD详细设置)(二)
vsftpd 作为一个主打安全的FTP服务器,有很多的选项设置.下面介绍了vsftpd的配置文件列表,而所有的配置都是基于vsftpd.conf这个配置文件 的.本文将提供完整的vsftpd.conf ...
- mysql记录sql执行时间
1.开启和关闭mysql> set profiling=1;mysql> set profiling=0; information_schema 的 database 会建立一个PROFI ...
- LeetCode39 Combination Sum
题目: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C ...
- iOS 开发调试技巧
对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...
- Python练习题 024:求位数及逆序打印
[Python练习题 024] 给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. ---------------------------------------------- ...
- Android 高级UI设计笔记19:PopupWindow使用详解
1. PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. 2. PopupWindow使用 ...