背景音乐的播放与停止实例代码如下:

  1. SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Jazz.mp3", true);
  2. SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Jazz.mp3");

背景音乐的播放代码放置到什么地方比较适合呢?例如:在Setting场景中,主要代码如下:

  1. bool Setting::init()
  2. {
  3. //播放代码                                                              ①
  4. return true;
  5. }
  6. void Setting::onEnter()
  7. {
  8. Layer::onEnter();
  9. log("Setting onEnter");
  10. //播放代码                                                              ②
  11. }
  12. void Setting::onEnterTransitionDidFinish()
  13. {
  14. Layer::onEnterTransitionDidFinish();
  15. log("Setting onEnterTransitionDidFinish");
  16. //播放代码                                                              ③
  17. }
  18. void Setting::onExit()
  19. {
  20. Layer::onExit();
  21. log("Setting onExit");
  22. }
  23. void Setting::onExitTransitionDidStart()
  24. {
  25. Layer::onExitTransitionDidStart();
  26. log("Setting onExitTransitionDidStart");
  27. }
  28. void Setting::cleanup()
  29. {
  30. Layer::cleanup();
  31. log("Setting cleanup");
  32. }

关于播放背景音乐,理论上我们是可以将播放代码SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3",true)放置到三个位置(代码中的①、②、③)。下面我们分别分析一下它们还有什么不同。
1、代码放到第①行
代码放到第①行(即在Setting::init函数),如果前面场景中没有调用背景音乐停止语句,则可以正常播放背景音乐。但是如果前面场景层HelloWorld::onExit函数有调用背景音乐停止语句,那么会出现背景音乐播放几秒钟后停止。

为了解释这个现象,我们可以参考一下6.3.2一节多场景切换生命周期。使用pushScene函数从实现HelloWorld场景进入Setting场景,生命周期函数调用顺序如下图所示。

从图中可见,HelloWorld::onExit调用是在Setting::init之后,这样当我们在Setting::init中开始播放背景音乐后,过一会调用HelloWorld::onExit停止背景音乐播放,这样问题就出现了。
注意 无论播放和停止的是否是同一个文件,都会出现个问题。

2、代码放到第②行
代码放到第②行(即在Setting::onExit函数),如果前面场景中没有调用背景音乐停止语句,则可以正常播放背景音乐。如果前面的场景层HelloWorld::onExit函数有背景音乐停止语句,也会出现背景音乐播放几秒钟后停止。原因与代码放到第①行情况一样。

3、代码放到第③行
我们推荐代码放到第③行代码位置,因为onEnterTransitionDidFinish函数是在进入层而且过渡动画结束时候调用,代码放到这里不用考虑中前面场景是否有调用背景音乐停止语句。而且用户也不会先听到声音,后出现界面现象。

综上所述,是否能够成功播放背景音乐,前面场景是否有调用背景音乐停止语句有关,也与当前场景中播放代码在哪个函数里有关。如果前面场景没有调用背景音乐停止语句,问题也就简单了,我们可以将播放代码放置在代码①、②、③任何一处。但是如果前面场景调用背景音乐停止语句,在onEnterTransitionDidFinish函数播放背景音乐会更好一些。

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

Cocos2d-x中播放背景音乐的更多相关文章

  1. [转载]C#中播放背景音乐几种的方法

    最经在写winform程序,其中有用到播放背景音乐 特此收集了一些网上的教程: 1.调用非托管的dll using System.Runtime.InteropServices; //DllImpor ...

  2. C#WinForm中播放背景音乐(亲测可用)

    using System.Runtime.InteropServices; public static uint SND_ASYNC = 0x0001; public static uint SND_ ...

  3. Android(java)学习笔记181:利用Service在后台播放背景音乐

    1.在android应用程序里,有一种没有UI的类(android.app.Service)——Service.简单来说,Service是一个 background process(背景程序),通过背 ...

  4. Android(java)学习笔记124:利用Service在后台播放背景音乐

    1. 在android应用程序里,有一种没有UI的类(android.app.Service)——Service.简单来说,Service是一个 background process(背景程序),通过 ...

  5. 【Cocos2dx】资源目录,播放背景音乐,导入外部库

    在Cocos2dx中播放背景音乐是一件非常easy的事情,就一行代码,可是首先要导入Cocos2dx的音频引擎cocosDenshion. cocosDenshion对cocos2dproject提供 ...

  6. Cocos2d-x中停止播放背景音乐

    停止背景音乐播放代码放置到什么地方比较适合呢?例如:在HelloWorld场景中,主要代码如下: bool HelloWorld::init() { return true; } void Hello ...

  7. 解决在微信中部分IOS不能自动播放背景音乐

    前言在做各种HTML5场景页面的时候,插入背景音乐是一个很普遍的需求.我们都知道,IOS下的safari是无法自动播放音乐的,以至一直以来造成一种错误的认识,iso是无法自动播放媒体资源的.直到微信火 ...

  8. 关于谷歌浏览器不能播放背景音乐的问题(与IE的不同之处)

    第一篇博文 忍受寂寞,抵制诱惑,持之以恒. 开发时,以下代码在IE浏览器上能顺利播放背景音乐,可在谷歌浏览器上却没有动静. <html> <body> <bgsound ...

  9. 如何在Cocos2D游戏中实现A*寻路算法(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

随机推荐

  1. JQuery ajax请求一直返回Error(parsererror)

    $.ajax({ type :"post", url :"busine_in.action", timeout : 40000, data: "cen ...

  2. 【转】GCC使用简介

    Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作品之一.gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一 ...

  3. delphi execCommand

    WebBrowser1.Document as IHTMLDocument2 关键点 function execCommand(const cmdID: WideString; showUI: Wor ...

  4. Web之真假分页

    在web设计中一个无法避免的问题就是分页显示.当数据量特别大的时候,我们不可能将全部的数据都在一个页面进行显示,假设这样将严重影响到它的美观性.所以在这个时候,分页显示则成为了我们的大功臣.当然分页也 ...

  5. int a[5]={}, &a+1与(int*)a+1的区别

    #include <iostream> #include <typeinfo> using namespace std; int main() { int b, *pb; ch ...

  6. debian的备份与还原

    不管是windows还是linux 备份都很重要 因为配好一个系统是要花很多时间的 出了问题的话 有备份直接还原就可以了 windows下有ghost 那么linux下呢?Linux可以在系统正在运行 ...

  7. Debian安装Apache2+MySQL5+PHP5(zz)

    转载:http://hi.baidu.com/lostdays/item/1d5e7e4833b4d20fc116134b 终于在Debian用apt-get安装好LAMP了,之前在CentOS使用编 ...

  8. android 几个小技巧

    1.如果打开模拟器,不同程序打开了不同的模拟器.可能是某个某个模拟器的target版本过低,修改一下4.2,应该都可以用了 2.找不到R.id.的错误,不妨删除menu文件夹下的xml文件 3.act ...

  9. 小白日记40:kali渗透测试之Web渗透-SQL手工注入(二)-读取文件、写入文件、反弹shell

    SQL手工注入 1.读取文件[load_file函数] ' union  SELECT null,load_file('/etc/passwd')--+ burpsuite 2.写入文件 ' unio ...

  10. BeanDefinitionRegistry extends AliasRegistry

    // 用该Registry注册一个新定义的bean,但是新的bean必须支持父的定义和子的定义void registerBeanDefinition(String beanName, BeanDefi ...