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

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

[html] view plaincopy

  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文件代码如下:

[html] view plaincopy

  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实例:设置背景音乐与音效-设置场景实现,布布扣,bubuko.com

时间: 2024-12-21 00:14:17

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

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

HelloWorld场景就是游戏中的主菜单场景.HelloWorld.h文件代码如下: #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" #include "SimpleAudioEngine.h" ① #include "SettingScene.h" class HelloWorld : public cocos2d::Layer { public: static cocos2d::Sce

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

为了进一步了解背景音乐和音效播放的,我们通过一个实例给大家介绍一下.如下图所示有两个场景:HelloWorld和Setting.在HelloWorld场景点击"游戏设置"菜单可以切换到Setting场景,在Setting场景中可以设置是否播放背景音乐和音效,设置完成后点击"OK"菜单可以返回到HelloWorld场景. 我们需要在AppDelegate中实现背景音乐播放暂停与继续函数,AppDelegate.h文件代码如下: #ifndef _APP_DELEGAT

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

UserDefault可以实现数据的存储,但是它的使用不能泛滥,具体讲一般情况下不会使用它保存大量的数据,它没有SQL语句那样的灵活.UserDefault除了保存游戏设置外,还有可以长期保持游戏精灵等对象的状态. 我们通过一个实例介绍一下在游戏项目中如何使用UserDefault.如图所示,在Setting场景中可以设置是否播放背景音乐和音效,现在我们将它完善将选择的状态保存到UserDefault中. 设置背景音乐与音效(上图HelloWorld场景.下图Setting场景) 我们需要定义两

Cocos2d-JS 中游戏背景音乐与音效

游戏中音频的处理也是非常重要的,它分为背景音乐播放与音效播放. 背景音乐是长时间循环播放的,它会长时间占用较大的内存,背景音乐不能多个同时播放. 而音效是短的声音,它占用内存较小,音效能多个同时播放. 在Cocos2d-JS中提供了一个音频引擎-AudioEngine,通过引擎能够很好地控制游戏背景音乐与音效优化播放. Cocos2d-JS音频文件 音频多媒体文件主要是存放音频数据信息,音频文件在录制的过程中把声音信号通过音频编码变成音频数字信号保存到某种格式文件中.在播放过程中再对音频文件解码

为网页设置背景音乐

<head><title>为网页设置背景音乐</title><style type="text/css"><!--body {margin-top: 0px;margin-bottom: 0px;}--></style></head><body><bgsound src="py.MP3" loop="-1"><table width=

linux下数据库实例监听开机自启动设置

linux下数据库实例监听开机自启动设置 2016/5/16 zhanky 脚本介绍 在开始之前,我们先介绍一下几个会用到的脚本. oratab oratab文件是在创建数据库实例时建立的,在安装时使用root用户执行root.sh脚本后得到.(如果忘记也可以直接手动创建.) 在$ORACLE_HOME/bin目录下的$ORACLE_HOME/bin/dbstart和$ORACLE_HOME/bin/dbshut需要调用/etc/oratab文件,如果不存在,dbstart和dbshut将失败,

简单方法为网页设置背景音乐

<head><title>为网页设置背景音乐</title><style type="text/css"><!--body {margin-top: 0px;margin-bottom: 0px;}--></style></head><body><bgsound src="py.MP3" loop="-1"><table width=

HEXO 加入外链播放器的一些技巧(如何设置背景音乐)

今天又去研究了一下关于hexo插入外链播放器的东西,结果还真的搞出来一些非常有趣的东西. 如果要加入外链播放器的话,我个人还是比较推荐使用网易云(因为实在是比较方便).去 http://music.163.com/ 找到想添加的歌曲,点击 生成外链播放器 ,会生成代码,加入到博客即可. 首先它会给你一段 HTML代码 ,如下所示: 1 <iframe frameborder="no" border="0" marginwidth="0" m

【cocos2d-x游戏开发】背景音乐与音效

在游戏中,我们把音乐文件分为两类.一是背景音乐,二是音效.比如说,进入一个场景之中,会有背景音乐的声音,主角是做出动作时,会有音效的产生等等呐.. 然而背景音乐和音效音乐是不大相同的,一般来说,背景音乐是很长的,然而音效却是很短暂的,只有短短的几秒而已.所以说,背景音乐只能播放一首,然而,音效却可以同时播放多个,相信大家在玩游戏时也有所体会. 在cocos2d-x3.x中,我们可以十分方便的调用CocosDenshion音效引擎库.我们需要加载音频文件时,只需要把相关的头文件写进来就可以了. #