设置场景(Setting),Setting.h文件代码如下:

  1. #ifndef __Setting_SCENE_H__
  2. #define __Setting_SCENE_H__
  3. #include "cocos2d.h"
  4. #include "SimpleAudioEngine.h"
  5. class Setting : public cocos2d::Layer
  6. {
  7. bool isEffect;                                                      ①
  8. public:
  9. static cocos2d::Scene* createScene();
  10. virtual bool init();
  11. virtual void onEnter();
  12. virtual void onEnterTransitionDidFinish();
  13. virtual void onExit();
  14. virtual void onExitTransitionDidStart();
  15. virtual void cleanup();
  16. void menuSoundToggleCallback(cocos2d::Ref* pSender);
  17. void menuMusicToggleCallback(cocos2d::Ref* pSender);
  18. void menuOkCallback(cocos2d::Ref* pSender);
  19. CREATE_FUNC(Setting);
  20. };
  21. #endif // __Setting_SCENE_H__
  22. #define __HELLOWORLD_SCENE_H__

上述代码第①是定义布尔类型成员变量isEffect,它用来保存现在是否允许音效,事实上是否允许音效和背景音乐播放状态应该持久化到文件中,由于我们还没有介绍数据持久化,所以我们采用isEffect变量记录状态,当我们在后面的章节学习完成数据持久化后,再保存它们状态。其它的代码与HelloWorld场景代码非常相似,这里不再赘述。Setting.cpp文件代码如下:

  1. #include "SettingScene.h"
  2. USING_NS_CC;
  3. using namespace CocosDenshion;
  4. … …
  5. bool Setting::init()
  6. {
  7. if ( !Layer::init() )
  8. {
  9. return false;
  10. }
  11. log("Setting init");
  12. Size visibleSize = Director::getInstance()->getVisibleSize();
  13. Point origin = Director::getInstance()->getVisibleOrigin();
  14. Sprite *bg = Sprite::create("setting-back.png");
  15. bg->setPosition(Point(origin.x + visibleSize.width/2,
  16. origin.y + visibleSize.height /2));
  17. this->addChild(bg);
  18. //音效
  19. auto soundOnMenuItem = MenuItemImage::create(
  20. "on.png",
  21. "on.png");
  22. auto soundOffMenuItem = MenuItemImage::create(
  23. "off.png",
  24. "off.png");
  25. auto soundToggleMenuItem = MenuItemToggle::createWithCallback(
  26. CC_CALLBACK_1(Setting::menuSoundToggleCallback, this),
  27. soundOffMenuItem,
  28. soundOnMenuItem,
  29. NULL);
  30. soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818, 220)));
  31. //背景音乐
  32. auto musicOnMenuItem  = MenuItemImage::create(
  33. "on.png",
  34. "on.png");
  35. auto musicOffMenuItem  = MenuItemImage::create(
  36. "off.png",
  37. "off.png");
  38. auto musicToggleMenuItem = MenuItemToggle::createWithCallback(
  39. CC_CALLBACK_1(Setting::menuMusicToggleCallback, this),
  40. musicOffMenuItem,
  41. musicOnMenuItem,
  42. NULL );
  43. musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818, 362)));
  44. //Ok按钮
  45. auto okMenuItem  = MenuItemImage::create(
  46. "ok-down.png",
  47. "ok-up.png",
  48. CC_CALLBACK_1(Setting::menuOkCallback, this));
  49. okMenuItem->setPosition(Director::getInstance()->convertToGL(Point(600, 510)));
  50. Menu* mn = Menu::create(soundToggleMenuItem, musicToggleMenuItem,okMenuItem, NULL);
  51. mn->setPosition(Point::ZERO);
  52. this->addChild(mn);
  53. return true;
  54. }
  55. void Setting::menuOkCallback(Ref* pSender)
  56. {
  57. Director::getInstance()->popScene();
  58. if (isEffect) {
  59. SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");                  ①
  60. }
  61. }
  62. void Setting::menuSoundToggleCallback(Ref* pSender)                         ②
  63. {
  64. auto soundToggleMenuItem = (MenuItemToggle*)pSender;
  65. log("soundToggleMenuItem %d", soundToggleMenuItem->getSelectedIndex());
  66. if (isEffect) {
  67. SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");                  ③
  68. }
  69. if (soundToggleMenuItem->getSelectedIndex() == 1) {//选中状态Off -> On                ④
  70. isEffect = false;
  71. } else {
  72. isEffect = true;
  73. SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");                  ⑤
  74. }
  75. }
  76. void Setting::menuMusicToggleCallback(Ref* pSender)                         ⑥
  77. {
  78. auto musicToggleMenuItem = (MenuItemToggle*)pSender;
  79. log("musicToggleMenuItem %d", musicToggleMenuItem->getSelectedIndex());
  80. if (musicToggleMenuItem->getSelectedIndex() == 1) {//选中状态Off -> On                ⑦
  81. SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Synth.mp3");
  82. } else {
  83. SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3");
  84. }
  85. if (isEffect) {
  86. SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav");                  ⑧
  87. }
  88. }
  89. void Setting::onEnter()
  90. {
  91. Layer::onEnter();
  92. log("Setting onEnter");
  93. }
  94. void Setting::onEnterTransitionDidFinish()
  95. {
  96. Layer::onEnterTransitionDidFinish();
  97. log("Setting onEnterTransitionDidFinish");
  98. isEffect = true;
  99. //播放
  100. SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3", true);      ⑨
  101. }
  102. void Setting::onExit()
  103. {
  104. Layer::onExit();
  105. log("Setting onExit");
  106. }
  107. void Setting::onExitTransitionDidStart()
  108. {
  109. Layer::onExitTransitionDidStart();
  110. log("Setting onExitTransitionDidStart");
  111. }
  112. void Setting::cleanup()
  113. {
  114. Layer::cleanup();
  115. log("Setting cleanup");
  116. //停止
  117. SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Synth.mp3");            ⑩
  118. }

上述代码第①、③、⑧行是在判断isEffect为true(音效播放开关打开)情况下播放音效。
代码第②行menuSoundToggleCallback是用户点击音效开发按钮时候回调函数,其中第④行代码是判断是否按钮状态从Off -> On,如果是则将开关变量isEffect 设置为false,否则为true,而且通过第⑤行代码SimpleAudioEngine::getInstance()->playEffect("sound/Blip.wav")播放一次音效。
代码第⑥行menuMusicToggleCallback是用户点击背景音乐按钮时候回调函数,其中第⑦行代码是判断是否按钮状态从Off -> On,如果是则停止播放背景音乐,否则为开始播放。

第⑧行代码是onEnterTransitionDidFinish()函数中播放背景音乐。第⑨行代码是cleanup()函数中停止播放背景音乐。

更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》
本书交流讨论网站:http://www.cocoagame.net
欢迎加入cocos2d-x技术讨论群:257760386、327403678
 

Cocos2d-x实例:设置背景音乐与音效-设置场景实现的更多相关文章

  1. Cocos2d-x实例:设置背景音乐与音效-HelloWorld场景实现

    HelloWorld场景就是游戏中的主菜单场景.HelloWorld.h文件代码如下: #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h& ...

  2. Cocos2d-x使用UserDefault数据持久化实例:保存背景音乐和音效设置

    UserDefault可以实现数据的存储,但是它的使用不能泛滥,具体讲一般情况下不会使用它保存大量的数据,它没有SQL语句那样的灵活.UserDefault除了保存游戏设置外,还有可以长期保持游戏精灵 ...

  3. Cocos2d-x实例:设置背景音乐与音效- AppDelegate实现

    为了进一步了解背景音乐和音效播放的,我们通过一个实例给大家介绍一下.如下图所示有两个场景:HelloWorld和Setting.在HelloWorld场景点击“游戏设置”菜单可以切换到Setting场 ...

  4. 创建 PDO 实例并在构造函数中设置错误模式

    PDO 将只简单地设置错误码,可使用 PDO::errorCode() 和 PDO::errorInfo() 方法来检查语句和数据库对象.如果错误是由于对语句对象的调用而产生的,那么可以调用那个对象的 ...

  5. jquery简单使用(看教程:快全有实例)(固定样式:$().val()设置属性,$().click()设置方法)

    jquery简单使用(看教程:快全有实例)(固定样式:$().val()设置属性,$().click()设置方法) 一.总结 1.jquery不懂之处直接看教程,案例都有,有简单又快 2.jquery ...

  6. Swift - 给游戏添加背景音乐和音效(SpriteKit游戏开发)

    游戏少不了背景音乐和音效.下面我们通过创建一个管理音效的类,来实现背景音乐的播放,同时点击屏幕可以播放相应的音效. 声音管理类 SoundManager.swift 1 2 3 4 5 6 7 8 9 ...

  7. android开发之背景音乐与音效

    android开发之背景音乐与音效 一:添加背景音乐(MediaPlayer) MediaPlayer class can be used to control playback of audio/v ...

  8. iOS开发--应用设置及用户默认设置【1、bundle的运用】

           在iphone里面,应用都会在“设置”里面有个专属的应用设置,选择该菜单界面,用户便可以在其中输入和更改各种选项,协助用户更便捷设置个人喜好与习惯. 在这一节中,希望能通过对捆绑包(bu ...

  9. iOS开发--应用设置及用户默认设置——转载

    [链接]iOS开发--应用设置及用户默认设置[1.bundlehttp://www.jianshu.com/p/6f2913f6b218 在iphone里面,应用都会在“设置”里面有个专属的应用设置, ...

随机推荐

  1. DuiLib(三)——控件消息

    上一篇讲了控件创建,这篇说说控件消息.directui的中心思想是在真实窗口之上画出所有控件,那这些控件是如何获取各自消息的? 通过第一篇的示例可以看到窗口消息的传递过程: CWindowWnd::_ ...

  2. HTTP Post Request using Apache Commons

    Demonstrates an HTTP Post using the Apache Commons HTTP library. Required Libraries: httpcore-4.1.ja ...

  3. Android 实现书籍翻页效果----升级篇

    自从之前发布了<Android 实现书籍翻页效果----完结篇 >之后,收到了很多朋友给我留言,前段时间由于事情较多,博客写得太匆忙很多细节地方没有描述清楚.所以不少人对其中的地方有不少不 ...

  4. openstack 创建虚拟机

    http://blog.csdn.net/tantexian/article/details/44595885#comments

  5. phonegap platform add ios 出错的问题

    在Mac上新安装的Phonegap,版本3.3-0.18.0. 本来创建项目后按教程: http://docs.phonegap.com/en/edge/guide_platforms_ios_ind ...

  6. 网络IPC:套接字

    网络进程间通信(network IPC):不同计算机(通过网络相连)上运行的进程相互通信的机制. 套接字网络IPC接口:进程能够使用该接口和其他进程通信.通过该接口,其他进程运行位置是透明的,它们可以 ...

  7. 20种常用的DOS命令小结

    先介绍一下通配符的概念. 通配符*和? *表示一个字符串 ?只代表一个字符 注意通配符只能通配文件名或扩展名,不能全都表示.例如我们要查找以字母y开头的所有文件,可以输入以下命令:dir y*.*:如 ...

  8. 终于找到了无毒版的fences1.0(2.0版本要收费的)

    今天终于安装了fences1.0,桌面不用那么乱哄哄的啦 我在博客里上传了安装文件,方便大家下载安装,这是无毒的哦,网上有很多都是不能通过病毒检测的. 地址如下:点击这里下载 使用方法: 创建块:安装 ...

  9. Android(java)学习笔记106-2:反射机制

    1.反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  10. python(1) - 列表和元组

    列表(list) 列表是经常用到的一种数据类型,是一组有序的数据集合,可以将各种数据有序的存放在列表中,并且可以对其进行增删改查,以及遍历. 列表就是为了使变量能够存储更多的信息,比如我想存储一张购物 ...