Cocos2D-x的音频分为长时间的背景音乐和短的音效两种,我们可以通过SimpleAudioEngine::sharedEngine()方法来获取音频播放的引擎,然后调用对音频相关的操作方法就可以了,那么这个是非常简单的。

在Cocos2D-x For WP8里面的要使用音频播放的API,我们需要把CocosDenshion这个项目添加到我们的游戏项目里面去,然后添加引用。如下图所示:

需要注意的是如果发现在编译的时候会出现下面的错误,那么通常是因为没有添加CocosDenshionWindowsPhone.lib链接库。

错误 306 error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class CocosDenshion::SimpleAudioEngine * __cdecl CocosDenshion::SimpleAudioEngine::sharedEngine(void)" (__imp_?sharedEngine@SimpleAudioEngine@CocosDenshion@@SAPAV12@XZ) referenced in function __unwind$26 F:\coco2d\cocos2dx-win8-wp8_v2\cocos2dx-win8-wp8_v2\HelloWorld\HelloWorldScene.obj HelloWorld

那么我们就需要在VS2012上通过这个路径( Project > Properties > Configuration Properties > Linker > Input > Additional Dependencies)来添加CocosDenshionWindowsPhone.lib链接库, 如下图所示:

示例代码:

  1. class TestLayer : public cocos2d::CCLayer
  2. {
  3. public:
  4. TestLayer(void);
  5. ~TestLayer(void);
  6. void menuCallback(cocos2d::CCObject * pSender);
  7. virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
  8. virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
  9.  
  10. private:
  11. cocos2d::CCMenu* m_pItmeMenu;
  12. cocos2d::CCPoint m_tBeginPos;
  13. int m_nTestCount;
  14. unsigned int m_nSoundId;
  15. };
  16.  
  17. TestLayer::TestLayer()
  18. {
  19. std::string testItems[] = {
  20. "play background music",
  21. "stop background music",
  22. "pause background music",
  23. "resume background music",
  24. "rewind background music",
  25. "is background music playing",
  26. "play effect",
  27. "play effect repeatly",
  28. "stop effect",
  29. "unload effect",
  30. "add background music volume",
  31. "sub background music volume",
  32. "add effects volume",
  33. "sub effects volume",
  34. "pause effect",
  35. "resume effect",
  36. "pause all effects",
  37. "resume all effects",
  38. "stop all effects"
  39. };
  40. //创建菜单栏
  41. m_pItmeMenu = CCMenu::create();
  42. CCSize s = CCDirector::sharedDirector()->getWinSize();
  43. m_nTestCount = sizeof(testItems) / sizeof(testItems[]);
  44. //添加菜单栏项目和点击的回掉函数
  45. for (int i = ; i < m_nTestCount; ++i)
  46. {
  47. CCLabelTTF* label = CCLabelTTF::create(testItems[i].c_str(), "Arial", );
  48. CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(TestLayer::menuCallback));
  49. m_pItmeMenu->addChild(pMenuItem, i + );
  50. pMenuItem->setPosition( CCPointMake( s.width / , (s.height - (i + ) * LINE_SPACE) ));
  51. }
  52. //设置菜单栏的位置
  53. m_pItmeMenu->setContentSize(CCSizeMake(s.width, (m_nTestCount + ) * LINE_SPACE));
  54. m_pItmeMenu->setPosition(CCPointZero);
  55. addChild(m_pItmeMenu);
  56.  
  57. setTouchEnabled(true);
  58.  
  59. //预加载背景音乐和音效
  60. SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCFileUtils::fullPathFromRelativePath(MUSIC_FILE) );
  61. SimpleAudioEngine::sharedEngine()->preloadEffect( CCFileUtils::fullPathFromRelativePath(EFFECT_FILE) );
  62.  
  63. //设置默认的音量
  64. SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);
  65. SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
  66. }
  67.  
  68. TestLayer::~TestLayer()
  69. {
  70. }
  71.  
  72. void TestLayer::menuCallback(CCObject * pSender)
  73. {
  74. //获取调用回掉函数的菜单,获取它的ZOrder,用于判断是那个菜单项触发的
  75. CCMenuItem* pMenuItem = (CCMenuItem *)(pSender);
  76. int nIdx = pMenuItem->getZOrder() - ;
  77.  
  78. switch(nIdx)
  79. {
  80. // 播放背景音乐
  81. case :
  82. SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::fullPathFromRelativePath(MUSIC_FILE)).c_str(), true);
  83. break;
  84. // 停止背景音乐
  85. case :
  86. SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
  87. break;
  88. // 暂停背景音乐
  89. case :
  90. SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
  91. break;
  92. // 恢复背景音乐
  93. case :
  94. SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
  95. break;
  96. // 回放背景音乐
  97. case :
  98. SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
  99. break;
  100. // 判断背景音乐是否正在播放
  101. case :
  102. if (SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying())
  103. {
  104. CCLOG("background music is playing");
  105. }
  106. else
  107. {
  108. CCLOG("background music is not playing");
  109. }
  110. break;
  111. // 播放音效
  112. case :
  113. m_nSoundId = SimpleAudioEngine::sharedEngine()->playEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str());
  114. break;
  115. // 重复播放音效
  116. case :
  117. m_nSoundId = SimpleAudioEngine::sharedEngine()->playEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str(), true);
  118. break;
  119. // 停止播放音效
  120. case :
  121. SimpleAudioEngine::sharedEngine()->stopEffect(m_nSoundId);
  122. break;
  123. // 移除音效
  124. case :
  125. SimpleAudioEngine::sharedEngine()->unloadEffect(std::string(CCFileUtils::fullPathFromRelativePath(EFFECT_FILE)).c_str());
  126. break;
  127. // 添加背景音乐音量
  128. case :
  129. SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() + 0.1f);
  130. break;
  131. // 减少背景音乐音量
  132. case :
  133. SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() - 0.1f);
  134. break;
  135. // 添加音效音量
  136. case :
  137. SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() + 0.1f);
  138. break;
  139. // 减少背景音乐音量
  140. case :
  141. SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() - 0.1f);
  142. break;
  143. //暂停音效播放
  144. case :
  145. SimpleAudioEngine::sharedEngine()->pauseEffect(m_nSoundId);
  146. break;
  147. case :
  148. //恢复音效播放
  149. SimpleAudioEngine::sharedEngine()->resumeEffect(m_nSoundId);
  150. break;
  151. //暂停所有音效播放
  152. case :
  153. SimpleAudioEngine::sharedEngine()->pauseAllEffects();
  154. break;
  155. case :
  156. //恢复所有音效播放
  157. SimpleAudioEngine::sharedEngine()->resumeAllEffects();
  158. break;
  159. case :
  160. //停止暂停所有音效播放
  161. SimpleAudioEngine::sharedEngine()->stopAllEffects();
  162. break;
  163. }
  164.  
  165. }
  166.  
  167. void TestLayer::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
  168. {
  169. CCSetIterator it = pTouches->begin();
  170. CCTouch* touch = (CCTouch*)(*it);
  171.  
  172. m_tBeginPos = touch->getLocationInView();
  173. m_tBeginPos = CCDirector::sharedDirector()->convertToGL( m_tBeginPos );
  174. }
  175. //处理菜单栏的滑动
  176. void TestLayer::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
  177. {
  178. CCSetIterator it = pTouches->begin();
  179. CCTouch* touch = (CCTouch*)(*it);
  180.  
  181. CCPoint touchLocation = touch->getLocationInView();
  182. touchLocation = CCDirector::sharedDirector()->convertToGL( touchLocation );
  183. float nMoveY = touchLocation.y - m_tBeginPos.y;
  184.  
  185. CCPoint curPos = m_pItmeMenu->getPosition();
  186. CCPoint nextPos = ccp(curPos.x, curPos.y + nMoveY);
  187. CCSize winSize = CCDirector::sharedDirector()->getWinSize();
  188. if (nextPos.y < 0.0f)
  189. {
  190. m_pItmeMenu->setPosition(CCPointZero);
  191. return;
  192. }
  193.  
  194. if (nextPos.y > ((m_nTestCount + )* LINE_SPACE - winSize.height))
  195. {
  196. m_pItmeMenu->setPosition(ccp(, ((m_nTestCount + )* LINE_SPACE - winSize.height)));
  197. return;
  198. }
  199.  
  200. m_pItmeMenu->setPosition(nextPos);
  201. m_tBeginPos = touchLocation;
  202. }

运行效果:

[Cocos2D-x For WP8]CocosDenshion音频播放的更多相关文章

  1. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

    --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制, ...

  2. HTML5 音频播放器-Javascript代码(短小精悍)

    直接上干货咯! //HTML5 音频播放器 lzpong 2015/01/19 var wavPlayer = function () { if(window.parent.wavPlayer) re ...

  3. IOS开发之简单音频播放器

    今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...

  4. ios原声音频播放AVAudioSession 总结

    //音频播放/*英译:record:录音 */ 1 导入头文件#import<AVFoundation/AVFoundation.h>//AVAudioSession是一个单例模式.在IO ...

  5. 微信小程序-图片、录音、音频播放、音乐播放、视屏、文件

    图片: wx.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照. OBJECT参数说明: 注:文件的临时路径,在小程序本次启动期间可以正常使用,如需持久保存,需在主动调用 wx ...

  6. Android音频播放之SoundPool

    SoundPool 一.基本概念 在Android应用程序的开发过程中,经常需要播放多媒体文件,也许最先想到的会是MediaPlayer类了,该类提供了播放.暂停.停止及重复播放等功能性方法(该类位于 ...

  7. iOS开发----音频播放、录音、视频播放、拍照、视频录制

    随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...

  8. 【jquery】一款不错的音频播放器——Amazing Audio Player

    前段时间分享了一款视频播放器,点击这里.今天介绍一款不错的音频播放器——Amazing Audio Player. 介绍: Amazing Audio Player 是一个使用很方便的 Windows ...

  9. Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...

    PS:今天搞了一下如何实现音频播放...结果被坑了,看书上写的代码是挺简单的,但是有个函数就是死活没看懂,这真是受不了...最后才弄明白,原来是一个实现异步任务的一个类...这个类使用java.uti ...

随机推荐

  1. Delphi操作XML简介

    参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...

  2. 【转载】Pyqt 编写的俄罗斯方块

    #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function from __future__ ...

  3. Oracle【IT实验室】数据库备份与恢复之五:Flashback

    Flashback在开发环境(有时生产环境的特殊情况下)是很有用的一个工具.     5.1 9i Flashback 简介     5.1.1  原理 当数据  update  或  delete  ...

  4. js判断当前的访问是手机/电脑

    <script type="text/javascript"> var commonURL = 'http://www.xxx.com/'; function mobi ...

  5. GitHub 使用教程图文详解(转)

    大纲: 一.前言 二.GitHub简介 三.注册GitHub账号 四.配置GitHub 五.使用GitHub 六.参与GitHub中其它开源项目 七.总结 注,GitHub官网:https://git ...

  6. HDU 5213 Lucky 莫队+容斥

    Lucky Problem Description WLD is always very lucky.His secret is a lucky number K.k is a fixed odd n ...

  7. 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数

    题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...

  8. HashMap合并相同key的value

    Map<String, String> map1 = new HashMap<>(); map1.put("x", "y"); map1 ...

  9. java基本数据类型及相互间的转换

    1.首先复习一下java的基本数据类型,见下图 2.比较他们的字节数 备注:1字节(Byte)=8位(Bit) 3.转换中的知识点 *java中整数类型默认的int类型:小数类型默认的double: ...

  10. Android自动化压力测试之Monkey Test Android常见的错误类型及黑白名单的使用方法(四)

    Android常见的错误类型有两种 1.ANR类型 1)在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2)BroadcastReceiver在10秒内没有执行完毕 2.Crash类型 1)异 ...