现场由导演级交换机Director实现。之间的相关的功能,如下面:

runWithScene(Scene* scene)。该函数能够执行场景。仅仅能在启动第一个场景时候调用该函数。假设已经有一个场景执行情况下则不能调用该函数。

replaceScene(Scene* scene)。

切换到下一个场景。

用一个新的场景替换当前场景。当前场景被终端释放。

pushScene(Scene* scene)。切换到下一个场景。将当前场景挂起放入到场景堆栈中,然后再切换到下一个场景中。

void popScene()。与pushScene配合使用,能够回到上一个场景。

void popToRootScene()。与pushScene配合使用,能够回到根场景。

我们须要注意replaceScene和pushScene使用的差别。

replaceScene会释放和销毁场景,假设须要保持原来场景的状态,replaceScene函数不适合。

pushScene并不会释放和销毁场景,原来场景的状态能够保持。可是场景不能放太多的场景对象。

使用replaceScene代码例如以下:

[html] view
plain
copy

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

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

[html] view
plain
copy

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

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

[html] view
plain
copy

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

[html] view
plain
copy

  1. bool HelloWorld::init()
  2. {
  3. if ( !Layer::init() )
  4. {
  5. return false;
  6. }
  7. Size visibleSize = Director::getInstance()->getVisibleSize();
  8. Point origin = Director::getInstance()->getVisibleOrigin();
  9. Sprite *bg = Sprite::create("background.png");
  10. bg->setPosition(Point(origin.x + visibleSize.width/2,
  11. origin.y +visibleSize.height /2));
  12. this->addChild(bg);
  13. //開始精灵
  14. Sprite *startSpriteNormal = Sprite::create("start-up.png");
  15. Sprite *startSpriteSelected =Sprite::create("start-down.png");
  16. MenuItemSprite*startMenuItem = MenuItemSprite::create(startSpriteNormal,
  17. startSpriteSelected,
  18. CC_CALLBACK_1(HelloWorld::menuItemStartCallback,this));
  19. startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700,170)));
  20. //设置图片菜单
  21. MenuItemImage *settingMenuItem = MenuItemImage::create(
  22. "setting-up.png",
  23. "setting-down.png",
  24. CC_CALLBACK_1(HelloWorld::menuItemSettingCallback,this));
  25. settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480,400)));
  26. //帮助图片菜单
  27. MenuItemImage *helpMenuItem = MenuItemImage::create(
  28. "help-up.png",
  29. "help-down.png",
  30. CC_CALLBACK_1(HelloWorld::menuItemHelpCallback,this));
  31. helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860,480)));
  32. Menu*mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL);
  33. mu->setPosition(Point::ZERO);
  34. this->addChild(mu);
  35. return true;
  36. }
  37. voidHelloWorld::menuItemSettingCallback(Ref* pSender)                                                    ①
  38. {
  39. autosc = Setting::createScene();                                                                                                     ②
  40. //Director::getInstance()->replaceScene(sc);                                                                                 ③
  41. Director::getInstance()->pushScene(sc);                                                                              ④
  42. }
  43. void HelloWorld::menuItemHelpCallback(Ref*pSender)
  44. {
  45. MenuItem* item = (MenuItem*)pSender;
  46. log("TouchHelp %p", item);
  47. }
  48. void HelloWorld::menuItemStartCallback(Ref*pSender)
  49. {
  50. MenuItem* item = (MenuItem*)pSender;
  51. log("TouchStart %p", item);
  52. }

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

第②行代码是创建设置创建对象。第③行是使用replaceScene函数进行场景切换。第④行代码是pushScene函数进行场景切换。

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

[html] view
plain
copy

  1. bool Setting::init()
  2. {
  3. if ( !Layer::init() )
  4. {
  5. return false;
  6. }
  7. Size visibleSize = Director::getInstance()->getVisibleSize();
  8. Point origin = Director::getInstance()->getVisibleOrigin();
  9. Sprite *bg = Sprite::create("setting-back.png");
  10. bg->setPosition(Point(origin.x + visibleSize.width/2,
  11. origin.y +visibleSize.height /2));
  12. this->addChild(bg);
  13. //音效
  14. auto soundOnMenuItem = MenuItemImage::create(
  15. "on.png",
  16. "on.png");
  17. auto soundOffMenuItem = MenuItemImage::create(
  18. "off.png",
  19. "off.png");
  20. auto soundToggleMenuItem = MenuItemToggle::createWithCallback(
  21. CC_CALLBACK_1(Setting::menuSoundToggleCallback,this),
  22. soundOnMenuItem,
  23. soundOffMenuItem,
  24. NULL);
  25. soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818,220)));
  26. //音乐
  27. auto musicOnMenuItem  =MenuItemImage::create(
  28. "on.png",
  29. "on.png");
  30. automusicOffMenuItem  =MenuItemImage::create(
  31. "off.png",
  32. "off.png");
  33. auto musicToggleMenuItem = MenuItemToggle::createWithCallback(
  34. CC_CALLBACK_1(Setting::menuMusicToggleCallback,this),
  35. musicOnMenuItem,
  36. musicOffMenuItem,
  37. NULL);
  38. musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818,362)));
  39. //Okbutton
  40. autookMenuItem  = MenuItemImage::create(
  41. "ok-down.png",
  42. "ok-up.png",
  43. CC_CALLBACK_1(Setting::menuOkCallback, this));
  44. okMenuItem->setPosition(Director::getInstance()->convertToGL(Point(600,510)));
  45. Menu* mn = Menu::create(soundToggleMenuItem,
  46. musicToggleMenuItem,okMenuItem,NULL);
  47. mn->setPosition(Point::ZERO);
  48. this->addChild(mn);
  49. return true;
  50. }
  51. void Setting::menuOkCallback(Ref*pSender)                                                                                   ①
  52. {
  53. Director::getInstance()->popScene();                                                                                             ②
  54. }
  55. void Setting::menuSoundToggleCallback(Ref*pSender)
  56. {}
  57. void Setting::menuMusicToggleCallback(Ref*pSender)
  58. {}

在第一代码①行-defined功能menuOkCallback。用户设置场景中点击“OK”当菜单回调。文章②的代码行popScene该函数返回HelloWorld幕后。

Cocos2d-x场景变化相关功能介绍的更多相关文章

  1. Maven 相关功能介绍

    一: Maven环境隔离

  2. EasyPlayerPro(Windows)流媒体播放器功能介绍及应用场景

    EasyPLyerPro(Windows)经过为期一个月的开发已经基本完成,虽然目前仍存在一些小问题,但是总体功能还是趋于比较稳定和强大的,下面对其功能和应用场景做简要介绍. 一.EasyPlayer ...

  3. Excel催化剂开源第31波-pdf相关功能实现及类库介绍

    在Excel催化剂刚推出的pdf相关功能中,反馈很热烈,不止是用户层面好多人喜欢,也听到在.NET开发群里有询问pdf在winform上展现的功能诉求,一段时间没写开源篇,生怕大家以为Excel催化剂 ...

  4. TMF SID性能相关实体介绍

    TMF SID性能相关实体介绍 Copyright © TeleManagement Forum 2013. All Rights Reserved. This document and transl ...

  5. redis5.0.0功能介绍以及主从集群、哨兵搭建

    这两天突然想起redis,索性就再尝试一下搭建最新版本的redis,过程有点艰辛呀,记录一下,供自己和大家今后搭建做参考. 一.为什么用Redis? 我自己总结了一下: 1.基于内存实现的key-va ...

  6. Java 17 新功能介绍(LTS)

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Jav ...

  7. Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍

    大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...

  8. CYQ.Data V5 数据库读写分离功能介绍

    前言 好多年没写关于此框架的新功能的介绍了,这些年一直在默默地更新,从Nuget上的记录就可以看出来: 这几天在看Java的一些东西,除了觉的Java和.NET的相似度实在太高之外,就是Java太原始 ...

  9. HBase的Snapshots功能介绍

    HBase的Snapshots功能介绍 hbase的snapshot功能还是挺有用的,本文翻译自cloudera的一篇博客,希望对想了解snapshot 的朋友有点作用,如果翻译得不好的地方,请查看原 ...

随机推荐

  1. HDU 5107 线段树扫描线

    给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...

  2. 【VB/.NET】Converting VB6 to VB.NET 【Part II】【之四】

    第四部分 原文 DLLs, DAO, RDO, ADO, and AD.NET; the History of VB DBs In the early versions of VB, there we ...

  3. Windows下visual studio code搭建golang开发环境

    Windows下visual studio code搭建golang开发环境 序幕 其实环境搭建没什么难的,但是遇到一些问题,主要是有些网站资源访问不了(如:golang.org),导致一些包无法安装 ...

  4. Linux下搭建tomcat集群全记录(转)

    本文将讲述如何在Linux下搭建tomcat集群,以及搭建过程中可能的遇到的问题和解决方法.为简单起见,本文演示搭建的集群只有两个tomact节点外加一个apache组成,三者将安装在同一机器上:ap ...

  5. 阿里云免费试用之体验——阿里云serverECS试用心得

    自上次參加了阿里云的开发人员大会回来 心里就一直惦记着阿里云 由于曾经各种各样什么的server也用了不少 年前開始接触阿里云 一直没有给予很多其它的关注 參加了这次的开发人员大会后 就想更进一步的了 ...

  6. MFC中模态对话框和非模态对话框的差别

    在MFC中有模态对话框和非模态对话框,那这两种有什么差别呢. 又都是用于什么场合呢. 首先,要弄清楚2种对话框是怎样创建的. 然后要弄清楚2种对话框有什么差别,可能从表面上看,模态会堵塞主对话框.可原 ...

  7. POJ 2676/2918 数独(dfs)

    思路:记录每行每列每一个宫已经出现的数字就可以.数据比較弱 另外POJ 3074 3076 必须用剪枝策略.但实现较麻烦,还是以后学了DLX再来做吧 //Accepted 160K 0MS #incl ...

  8. DataInputStream类readLong()引起的思考

    今天无意中看了下jdk中的DataInputStream类,然后看到readLong()方法,如下: private byte readBuffer[] = new byte[8]; public f ...

  9. apache +php +php curl 模块设置

    2.2 linux 下面 2.2.1 web服务器安装 1目前采用的web服务器是apache2,在ubuntu 下安装 apt-getupdate apt-get installapache2 测试 ...

  10. C#索引器的应用:自已写一个表格

    C#中索引器,在一个类中有很多的同一类型成员的时候,比较适用索引器. 环境:我们假设有一个动物园,里边有很多动物. 用法: 1.先定义一个类,这是成员的类型.在这里就是要定义一个Animal类: pu ...