`

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

 
阅读更多

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

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. #ifndef __Setting_SCENE_H__  
  2. #define __Setting_SCENE_H__  
  3.   
  4.   
  5. #include "cocos2d.h"  
  6. #include "SimpleAudioEngine.h"  
  7.   
  8.   
  9. class Setting : public cocos2d::Layer  
  10. {  
  11.     bool isEffect;                                                      ①  
  12. public:  
  13.     static cocos2d::Scene* createScene();  
  14.     virtual bool init();    
  15.     virtual void onEnter();  
  16.     virtual void onEnterTransitionDidFinish();  
  17.     virtual void onExit();  
  18.     virtual void onExitTransitionDidStart();  
  19.     virtual void cleanup();  
  20.       
  21.     void menuSoundToggleCallback(cocos2d::Ref* pSender);  
  22.     void menuMusicToggleCallback(cocos2d::Ref* pSender);  
  23.     void menuOkCallback(cocos2d::Ref* pSender);  
  24.       
  25.     CREATE_FUNC(Setting);  
  26. };  
  27.   
  28.   
  29. #endif // __Setting_SCENE_H__  
  30.   
  31.   
  32. #define __HELLOWORLD_SCENE_H__  





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

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



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

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

 

 

 

更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
本书交流讨论网站:http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
欢迎加入Cocos2d-x技术讨论群:257760386


《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11584534.html

亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当:http://product.dangdang.com/23606265.html

互动出版网:http://product.china-pub.com/3770734

 

《Cocos2d-x实战 C++卷》源码及样章下载地址:

源码下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

样章下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台
分享到:
评论

相关推荐

    Cocos2d-x 3.x游戏开发实战pdf含目录

    本书会介绍Cocos2d-x的音频API,包括音乐播放、音效处理以及音效资源的加载和管理。 此外,书中还会涉及用户输入处理、触摸事件、键盘事件的响应,以及如何实现游戏的交互功能。对于网络编程,Cocos2d-x提供了网络...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    6. **音频和音乐**:介绍如何在Cocos2d-x中播放背景音乐和音效,以及音乐的控制和管理。 7. **网络与存储**:讨论如何进行网络通信,如下载更新、保存和读取游戏数据。 8. **性能优化**:提供关于代码优化、内存...

    Cocos2d-x实战 JS卷

    9. **音频播放**:掌握音频管理,包括背景音乐、音效的播放与控制,提升游戏体验。 10. **性能优化**:探讨性能分析工具的使用,以及如何优化代码执行效率、减少内存占用和CPU负载。 11. **发布与打包**:学习项目...

    Cocos2d-x实战C++卷 关东升著 完整版含目录

    实战C++卷可能包括了对Cocos2d-x框架中关键概念、类和API的实践指导,例如游戏场景、精灵、动画、物理引擎、粒子系统、音效和用户界面等。开发者可以在这本书中找到如何使用C++语言和Cocos2d-x框架结合的实例。 5. ...

    cocos2dx_study.rar_cocos2d-x_cocos2d-x实例_cocos2dx

    cocos2d-x支持播放背景音乐和音效,理解如何加载、播放和控制音频,能提升游戏的沉浸感。 八、网络和存储 cocos2d-x提供了网络接口,可以实现数据的发送和接收,这对于网络游戏和在线功能至关重要。同时,学习如何...

    Cocos2D-X开发学习笔记-音乐和音效的使用示例

    本笔记将深入探讨Cocos2D-X中的音乐和音效处理,帮助开发者更好地理解如何在游戏项目中实现音频功能。 在Cocos2D-X中,音乐和音效的管理主要通过`cocos2d::AudioEngine`类来完成。这个类提供了一系列的方法用于播放...

    cocos2d-x游戏实例-简易动作游戏

    《cocos2d-x游戏实例-简易动作游戏》 cocos2d-x是一款跨平台的2D游戏开发框架,基于C++,同时支持Lua和JavaScript等脚本语言,广泛应用于移动设备上的游戏开发。本实例将带你深入理解如何使用cocos2d-x创建一个简易...

    cocos2d-x高仿微信打飞机

    7. **音频处理**:游戏中的背景音乐和音效也是重要组成部分,cocos2d-x的AudioEngine模块可以方便地播放和管理音频资源。 8. **跨平台发布**:cocos2d-x支持多平台发布,通过同一套代码可以生成不同平台的应用。...

    flappy bird 基于cocos2d-x 3.8

    在Cocos2d-x中,你可以通过创建`cc::Sprite`类实例来表示这些对象。鸟的飞行动画可以通过多个精灵帧来实现,而管道则可以作为静态精灵进行显示。 4. **物理引擎**:为了实现鸟的飞行效果,我们需要使用Cocos2d-x...

    Cocos2d-x 3.X游戏开发入门精解

    首先,书中会介绍Cocos2d-x的基础知识,包括安装环境、创建项目、设置资源路径等,使读者对Cocos2d-x的开发环境有一个全面的认识。这一部分还会讲解如何使用Cocos Studio进行图形界面设计,以及如何将设计成果导入到...

    cocos2d-x3.2贪吃蛇游戏代码与资源

    总之,《cocos2d-x3.2贪吃蛇游戏代码与资源》是学习cocos2d-x引擎的理想实践案例,它涵盖了场景管理、图形绘制、事件处理、资源管理等多个重要知识点,对于初学者来说,通过分析和修改这个游戏的源码,能够深入理解...

    cocos2d-x学习笔记

    《cocos2d-x学习笔记》 在学习cocos2d-x时,了解其核心组件和工作流程至关重要。AppDelegate是cocos2d-x框架中的一个关键类,它扮演着应用程序入口点的角色,处理应用程序的生命周期事件。让我们深入探讨...

    Cocos2d-x 2.1.4 萝莉快跑修改版

    Cocos2d-x是一款开源的游戏开发框架,广泛用于创建2D游戏、演示程序和其他图形交互应用。...对于想要深入研究Cocos2d-x游戏开发或者对《萝莉快跑》这款游戏有兴趣的人来说,这是一个有价值的参考实例。

    Cocos2d-X by Example Beginner's Guide-code

    游戏中的音频管理也是Cocos2d-X的重要部分,它支持音乐和音效的播放,提供简单易用的接口进行控制。同时,Cocos2d-X的网络模块则方便开发者实现在线功能,如数据同步、排行榜、多人联机等。 除此之外,Cocos2d-X...

    Cocos2d-x高级开发教程_含书签目录_源代码

    4. **音频处理**:介绍Cocos2d-x的音频管理,如何播放背景音乐、音效,并进行音量控制。 5. **用户输入与交互**:讨论处理触摸事件、键盘事件的方法,以及如何创建响应玩家操作的游戏逻辑。 6. **网络编程**:包括...

    cocos2d-x学习笔记\cocos2d-x学习笔记(17)--简单游戏实例1--双枪手

    cocos2d-x提供了`AudioEngine`类来播放音效和背景音乐。我们可以在游戏事件发生时,如射击、敌人死亡等,播放对应的音效。 最后,游戏的性能优化也非常重要。cocos2d-x提供了一些工具和技巧来帮助开发者优化帧率,...

    Cocos2d-x 3.x游戏开发之旅_PDF电子书下载 带书签目录 高清完整版.pdf

    3. **图形与动画**:详细介绍如何使用Cocos2d-x绘制2D图形,包括精灵(Sprite)、纹理(Texture)、图集(Atlas)、动作(Action)和动画(Animation),并提供实例演示如何创建复杂的视觉效果。 4. **物理引擎**:...

    cocos2d-x游戏实例 萝莉快跑

    本实例“萝莉快跑”是基于Cocos2D-x 2.0.4版本实现的一个游戏项目,旨在帮助开发者了解和掌握Cocos2D-x的游戏开发技术。通过分析和实践这个实例,我们可以深入学习到Cocos2D-x中的关键概念和功能。 1. **场景和层的...

    COCOS2D-X 2.2 实例 瞄星大战

    《COCOS2D-X 2.2 实例:瞄星大战》是基于Cocos2d-x游戏开发框架的一个经典实例,旨在帮助开发者理解和掌握如何使用Cocos2d-x 2.2版本来构建游戏。Cocos2d-x是一款开源的游戏引擎,广泛应用于2D游戏的开发,尤其在...

    兄弟连cocos2d-x3.0 final视频教程完整版

    6. **声音与音乐**:教授如何在游戏中添加背景音乐和音效,提升玩家体验。 7. **网络通信**:简述Cocos2d-x中实现网络通信的方法,包括HTTP请求、Socket编程等。 8. **性能优化**:分享提高游戏运行效率的经验...

Global site tag (gtag.js) - Google Analytics