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)
- {}
在第一代码①行-defined功能menuOkCallback。用户设置场景中点击“OK”当菜单回调。文章②的代码行popScene该函数返回HelloWorld幕后。
Cocos2d-x场景变化相关功能介绍的更多相关文章
- Maven 相关功能介绍
一: Maven环境隔离
- EasyPlayerPro(Windows)流媒体播放器功能介绍及应用场景
EasyPLyerPro(Windows)经过为期一个月的开发已经基本完成,虽然目前仍存在一些小问题,但是总体功能还是趋于比较稳定和强大的,下面对其功能和应用场景做简要介绍. 一.EasyPlayer ...
- Excel催化剂开源第31波-pdf相关功能实现及类库介绍
在Excel催化剂刚推出的pdf相关功能中,反馈很热烈,不止是用户层面好多人喜欢,也听到在.NET开发群里有询问pdf在winform上展现的功能诉求,一段时间没写开源篇,生怕大家以为Excel催化剂 ...
- TMF SID性能相关实体介绍
TMF SID性能相关实体介绍 Copyright © TeleManagement Forum 2013. All Rights Reserved. This document and transl ...
- redis5.0.0功能介绍以及主从集群、哨兵搭建
这两天突然想起redis,索性就再尝试一下搭建最新版本的redis,过程有点艰辛呀,记录一下,供自己和大家今后搭建做参考. 一.为什么用Redis? 我自己总结了一下: 1.基于内存实现的key-va ...
- Java 17 新功能介绍(LTS)
点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Jav ...
- Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍
大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...
- CYQ.Data V5 数据库读写分离功能介绍
前言 好多年没写关于此框架的新功能的介绍了,这些年一直在默默地更新,从Nuget上的记录就可以看出来: 这几天在看Java的一些东西,除了觉的Java和.NET的相似度实在太高之外,就是Java太原始 ...
- HBase的Snapshots功能介绍
HBase的Snapshots功能介绍 hbase的snapshot功能还是挺有用的,本文翻译自cloudera的一篇博客,希望对想了解snapshot 的朋友有点作用,如果翻译得不好的地方,请查看原 ...
随机推荐
- 陈词滥调,正确使用memset
前项目发现一个问题,计划永远是一个dynamic_cast当一个异常动态转换,搜索了半天才发现问题竟然是在memset使用,见.但当处于几十万行代码量级中时,就变得不太那么easy定位了. 本文归纳了 ...
- Java中的工具类和新特性
1:Collections集合框架工具类: /* 集合框架的工具类. Collections:集合框架的工具类.里面定义的都是静态方法. Collections和Collection有什么差别? Co ...
- selenium webdriver缺陷
关闭 selenium webdriver缺陷 除了http://573301735.com/?p=5126讲 的,昨天又发现一个让我1个小时生不如死的问题,就是使用两个不同的配置文件来初始化dri ...
- bzoj(矩阵快速幂)
题意:定义Concatenate(1,N)=1234567……n.比如Concatenate(1,13)=12345678910111213.给定n和m,求Concatenate(1,n)%m. (1 ...
- ZooKeeper场景实践:(2)集中式配置管理
1. 基本介绍 在分布式的环境中,可能会有多个对等的程序读取相同的配置文件,程序能够部署在多台机器上,假设配置採用文件的话,则须要为部署该程序的机器也部署一个配置文件,一旦要改动配置的时候就会很麻烦, ...
- Javascript异步数据的同步处理方法
数据处理方法封装 var DataWatch=(function(){ var gWatch={},cursor= 0,callback_key = 'callback',gMap={}; var c ...
- javascript一元操作符(递增,递减)
<script type="text/javascript"> var a="1"; var b=false; var c="dd&quo ...
- HiPAC高性能规则匹配算法之查找过程
收到一封邮件,有位朋友认为我误解了nf-HiPAC.如此的一个高性能算法怎能被什么传统的hash,tree之类的胁迫.是啊.HiPAC是一个非常猛的算法.文档也比較少,这就更加添加了其神奇感,可是这决 ...
- 不root的情况下 查看App的数据表
一直以来查看sqlite的数据库都须要root才干查看,可是公司的好多測试机root起来比較麻烦~~~ 近期刚好项目上线,略闲, 于是决定写一个libraryproject便于以后调试代码 关键代码例 ...
- 上市ASCII 表省内发现!
表格来自,这里 扩展码表: