本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010

UI在游戏中占有很重要的地位,但吸引玩家的除了这些看得到的界面和动画之外,游戏在后台中播放的背景音乐

及游戏中打击、动作等音效的配合则会让游戏更受玩家的喜爱。在Cocos2D-X中也为我们封装了一个跨平台的、播放

音频相关的类SimpleAudioEngine,下面就让我们一起来学习这个类。

一、音乐与音效

由于Cocos2D-X是跨平台的引擎,所以如果大家想通过一套代码多平台通用播放音乐与音效,可以通过Cocos2D-X

定义的宏CC_TARGET_PLATFORM平台变量来区别播放的音频格式。比如,Android只支持ogg的音频格式。

SimpleAudioEngine的使用比较简单,此类不需要创建,只需要调用其中的播放、暂停、重复播放等与音乐、音效

相关的函数即可。

二、音乐与音效的相关函数

1、音乐相关的函数

<1> preloadBackgroundMusic:(NSString *) filePath

作用:预加载背景音乐文件。

参数:音乐文件的相对路经。

<2> playBackgroundMusic:(NSString *) filePath loop:(BOOL) loop

作用:播放背景音乐文件。

参数1:音乐文件的相对路经。

参数2:是否重复播放。

<3> stopBackgroundMusic()

作用:停止背景音乐。

<4> pauseBackgroundMusic()

作用:暂停背景音乐。

<5> resumeBackgroundMusic()

作用:继续播放背景音乐。

<6> rewindBackgroundMusic()

作用:倒带到音乐刚开始。

<7> isBackgroundMusicPlaying()

作用:获取当前背景音乐是否正在播放中。

<8> float getBackgroundMusicVolume()

作用:获取当前背景音乐的音量。

返回值:其音量范围[0.0,1.0]。

<9> setBackgroundMusicVolume(float volume)

作用:设置当前背景音乐的音量。

返回值:其音量范围[0.0,1.0]。

2、音效相关的函数

<1> preloadEffect(const char * pszFilePath)

作用:预设加载音效。

参数:音效文件的相对路经。

<2> unloadEffect(const char * pszFilePath)

作用:释放音效文件。

参数:音效文件的相对路经。

<3> unsigned int preloadEffect(const char * pszFilePath,bool bLoop)

作用:播放音效文件。

参数1:音效文件的相对路经。

参数2:是否重复播放。

返回值:为播放的音效生成ID。

<4> stopEffect(unsigned int nSoundId)

作用:停止音效播放。

参数:需要停止音效的ID。

<5> pauseEffect(unsigned int nSoundId)

作用:暂停音效播放。

参数:需要暂停音效的ID。

<6> resumeEffect(unsigned int nSoundId)

作用:继续音效播放。

参数:需要继续播放音效的ID。

<7> float getEffectsVolume(unsigned int nSoundId)

作用:获取音效音量。

参数:音效音量范围[0.0,1.0]。

<8> setEffectsVolume(float volume)

作用:设置音效音量。

参数:音效音量范围[0.0,1.0]。

<9> pauseAllEffects()

作用:暂停所有音效。

<10> resumeAllEffects()

作用:继续播放所有音效。

<11> stopAllEffects()

作用:停止所有音效。

三、项目实例

1、首先新建Cocos2D-X项目,取名为“MyMusicEffect”,然后在HelloWorldScene.h文件中声明如下成员函数和变量。

  1. class HelloWorld : public cocos2d::CCLayer
  2. {
  3. public:
  4. // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
  5. virtual bool init();
  6.  
  7. // there's no 'id' in cpp, so we recommand to return the exactly class pointer
  8. static cocos2d::CCScene* scene();
  9.  
  10. //menuitem回调函数
  11. void menuBack(CCObject * pSender);
  12.  
  13. //用以记录音效ID
  14. int effectId ;
  15.  
  16. // implement the "static node()" method manually
  17. CREATE_FUNC(HelloWorld);
  18. };

2、然后在HelloWorldScene.cpp文件中添加如下所示代码。

  1. #include "HelloWorldScene.h"
  2. #include "SimpleAudioEngine.h"
  3.  
  4. using namespace cocos2d;
  5. using namespace CocosDenshion;
  6.  
  7. //根据不同平台使用预编译索引不同音频文件
  8. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
  9. #define EFFECT_FILE "effect2.ogg"
  10. #elif( CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
  11. #define EFFECT_FILE "effect1.raw"
  12. #else
  13. #define EFFECT_FILE "effect1.wav"
  14. #endif
  15.  
  16. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
  17. #define MUSIC_FILE "music.mid"
  18. #elif (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY)
  19. #define MUSIC_FILE "background.ogg"
  20. #else
  21. #define MUSIC_FILE "background.mp3"
  22. #endif
  23.  
  24. std::string items[] = {
  25. "play background music",
  26. "stop background music",
  27. "pause background music",
  28. "resume background music",
  29. "rewind background music",
  30. "is background music playing",
  31. "play effect",
  32. "play effect repeatly",
  33. "stop effect",
  34. "unload effect",
  35. "add background music volume",
  36. "sub background music volume",
  37. "add effects volume",
  38. "sub effects volume",
  39. "pause effect",
  40. "resume effect",
  41. "pause all effects",
  42. "resume all effects",
  43. "stop all effects"
  44. };
  45.  
  46. CCScene* HelloWorld::scene()
  47. {
  48. CCScene * scene = NULL;
  49. do
  50. {
  51. // 'scene' is an autorelease object
  52. scene = CCScene::create();
  53. CC_BREAK_IF(! scene);
  54.  
  55. // 'layer' is an autorelease object
  56. HelloWorld *layer = HelloWorld::create();
  57. CC_BREAK_IF(! layer);
  58.  
  59. // add layer as a child to scene
  60. scene->addChild(layer);
  61. } while (0);
  62.  
  63. // return the scene
  64. return scene;
  65. }
  66.  
  67. // on "init" you need to initialize your instance
  68. bool HelloWorld::init()
  69. {
  70. bool bRet = false;
  71. do
  72. {
  73.  
  74. CC_BREAK_IF(! CCLayer::init());
  75.  
  76. CCMenu* m_pItmeMenu = CCMenu::create();
  77. CCSize s = CCDirector::sharedDirector()->getWinSize();
  78. int m_nTestCount = sizeof(items) / sizeof(items[0]);
  79.  
  80. for (int i = 0; i < m_nTestCount; i++){
  81. CCLabelTTF* label = CCLabelTTF::create(items[i].c_str(), "Arial", 15);
  82.  
  83. CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(HelloWorld::menuBack));
  84.  
  85. m_pItmeMenu->addChild(pMenuItem, i);
  86. pMenuItem->setPosition( CCPointMake(0, (s.height*0.5-20- (i + 1) * 15) ));
  87. }
  88. addChild(m_pItmeMenu,0,100);
  89. //预加载音乐和音效
  90. SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);
  91. SimpleAudioEngine::sharedEngine()->preloadEffect(EFFECT_FILE);
  92. //设置默认音量
  93. SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);
  94. SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
  95.  
  96. bRet = true;
  97. } while (0);
  98.  
  99. return bRet;
  100. }
  101.  
  102. void HelloWorld::menuBack(CCObject * pSender){
  103. CCMenuItem* pMenuItem = (CCMenuItem *)(pSender);
  104. int nIdx = pMenuItem->getZOrder() ;
  105. switch(nIdx)
  106. {
  107. case 0:
  108. //播放背景音乐
  109. SimpleAudioEngine::sharedEngine()->playBackgroundMusic(MUSIC_FILE , true);
  110. break;
  111. case 1:
  112. //停止背景音乐
  113. SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
  114. break;
  115. case 2:
  116. //暂停背景音乐
  117. SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
  118. break;
  119. case 3:
  120. //继续播放背景音乐
  121. SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
  122. break;
  123. case 4:
  124. //后退背景音乐
  125. SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
  126. break;
  127. case 5:
  128. //背景音乐是否正在播放
  129. if (SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying()){
  130. CCLOG("背景音乐正在播放");
  131. }else{
  132. CCLOG("背景音乐没在播放");
  133. }
  134. break;
  135. case 6:
  136. //播放音效,并且得到此音效的ID
  137. effectId = SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE);
  138. break;
  139. case 7:
  140. //重复播放音效
  141. effectId = SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE, true);
  142. break;
  143. case 8:
  144. //停止音效播放
  145. SimpleAudioEngine::sharedEngine()->stopEffect(effectId);
  146. break;
  147. case 9:
  148. //释放音效
  149. SimpleAudioEngine::sharedEngine()->unloadEffect(EFFECT_FILE);
  150. break;
  151. case 10:
  152. //增加背景音乐的音量
  153. SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() + 0.1f);
  154. break;
  155. case 11:
  156. //减少背景音乐的音量
  157. SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() - 0.1f);
  158. break;
  159. case 12:
  160. //增加音效的音量
  161. SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() + 0.1f);
  162. break;
  163. case 13:
  164. //减少音效的音量
  165. SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() - 0.1f);
  166. break;
  167. case 14:
  168. //暂停音效
  169. SimpleAudioEngine::sharedEngine()->pauseEffect(effectId);
  170. break;
  171. case 15:
  172. //继续播放音效
  173. SimpleAudioEngine::sharedEngine()->resumeEffect(effectId);
  174. break;
  175. case 16:
  176. //暂停所有音效
  177. SimpleAudioEngine::sharedEngine()->pauseAllEffects();
  178. break;
  179. case 17:
  180. //继续所有音效
  181. SimpleAudioEngine::sharedEngine()->resumeAllEffects();
  182. break;
  183. case 18:
  184. //停止所有音效
  185. SimpleAudioEngine::sharedEngine()->stopAllEffects();
  186. break;
  187. }
  188. }

3、实例效果图

源码下载地址

【Cocos2d-X开发学习笔记】第28期:游戏中音乐和音效的使用的更多相关文章

  1. Rest API 开发 学习笔记(转)

    Rest API 开发 学习笔记 概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着 ...

  2. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  3. 【前端】移动端Web开发学习笔记【1】

    下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...

  4. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  5. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

  6. 高性能Cordova App开发学习笔记

    高性能Cordova App开发学习笔记 文件结构 添加插件 构建准备 各个www的作用,prepare命令会将hello\www的内容会拷贝到platform下的wwww目录,知道该改哪里了吧?如果 ...

  7. 步步为营 SharePoint 开发学习笔记系列总结

    转:http://www.cnblogs.com/springyangwc/archive/2011/08/03/2126763.html 概要 为时20多天的sharepoint开发学习笔记系列终于 ...

  8. Kinect开发学习笔记之(一)Kinect介绍和应用

    Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...

  9. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

随机推荐

  1. window下如何搭建linux环境

    1.使用虚拟机 使用VMware虚拟机,下载linux内核系统,加载运行. 2.cygwin 安装cygwin,设置环境变量. 第二种方法还是比较简便的.优先考虑.

  2. 循环次数( M - 暴力求解、打表)

    循环次数 Description           我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如,         如果代码中出现         for(i=1;i ...

  3. 外设:K9F2G08 nandflash 底层读写、控制驱动程序,可随机读写

    /****************************************************************************** Copyright (C), 2001- ...

  4. [Swust OJ 763]--校门外的树 Plus(暴力枚举)

    题目链接:http://acm.swust.edu.cn/problem/0763/ Time limit(ms): 1000 Memory limit(kb): 65535 西南某科技大学的校门外有 ...

  5. BZOJ 2718: [Violet 4]毕业旅行( 最长反链 )

    一不小心速度就成了#1.... 这道题显然是求最长反链, 最长反链=最小链覆盖.最小链覆盖就是先做一次floyd传递闭包, 再求最小路径覆盖. 最小路径覆盖=N - 二分图最大匹配. 所以把所有点拆成 ...

  6. java:转换时间格式为String

    SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date curDate = new ...

  7. Android:设置背景图和标题

    在MainActivity.onCreate(Bundle savedInstanceState){}设置背景图和标题. setTitle("wyl的diary");//标题,即左 ...

  8. 引用 mkimage使用详解

    引用 鱼 的 mkimage使用详解  uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来 ...

  9. PHP用CURL或fsockopen伪造IP和来路(referer)

    URL是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 CURL库. 我们可以用CURL来伪造IP和来路,例子:1.php 请求 ...

  10. 17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标:

    17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标: 你需要master ...