Cocos2d-JS提供了一个音频CocosDenshion引擎。具体使用的API是cc.AudioEngine。cc.AudioEngine有几个常用的函数:
playMusic(url, loop)。播放背景音乐,参数url是播放文件的路径,参数loop控制是否循环播放,缺省情况下false。
stopMusic()。停止播放背景音乐。
pauseMusic()。暂停播放背景音乐。
resumeMusic ()。继续播放背景音乐。
isMusicPlaying()。判断背景音乐是否在播放。
playEffect (url, loop)。播放音效,参数同playMusic函数。
pauseEffect(audioID)。暂停播放音效,参数audioID是playEffect函数返回ID。
pauseAllEffects ()。暂停所有播放音效。
resumeEffect (audioID)。继续播放音效,参数audioID是playEffect函数返回ID。
resumeAllEffects ()。继续播放所有音效。
stopEffect(audioID)。停止播放音效,参数audioID是playEffect函数返回ID。
stopAllEffects ()。停止所有播放音效。

音频文件的预处理
无论是播放背景音乐还是音效在播放之前进行预处理是有必要的。如果不进预处理,则会发现在第一次播放这个音频文件时候感觉很“卡”,用户体验不好。Cocos2d-JS中提供了资源文件的预处理功能。
通过模板生成的Cocos2d-JS工程中有一个main.js,它的内容如下:

  1. cc.game.onStart = function(){
  2. cc.view.setDesignResolutionSize(1136, 640, cc.ResolutionPolicy.EXACT_FIT);
  3. cc.view.resizeWithBrowserSize(true);
  4. //load resources
  5. cc.LoaderScene.preload(g_resources, function () {                           ①
  6. cc.director.runScene(new HelloWorldScene());
  7. }, this);
  8. };
  9. cc.game.run();

其中cc.LoaderScene.preload函数可以预处理一些资源,其中g_resources是资源文件集合变量,它是在resource.js文件中定义的,resource.js文件的内容如下:

  1. var res = {
  2. //image
  3. On_png: "res/on.png",
  4. Off_png: "res/off.png",
  5. background_png: "res/background.png",
  6. start_up_png: "res/start-up.png",
  7. start_down_png: "res/start-down.png",
  8. setting_up_png: "res/setting-up.png",
  9. setting_down_png: "res/setting-down.png",
  10. help_up_png: "res/help-up.png",
  11. help_down_png: "res/help-down.png",
  12. setting_back_png: "res/setting-back.png",
  13. ok_down_png: "res/ok-down.png",
  14. ok_up_png: "res/ok-up.png",
  15. //plist
  16. //fnt
  17. //tmx
  18. //bgm
  19. //music
  20. bgMusicSynth_mp3: 'res/sound/Synth.mp3',                                ①
  21. bgMusicJazz_mp3: 'res/sound/Jazz.mp3'                                   ②
  22. //effect
  23. };
  24. var g_resources = [                                                     ③
  25. ];
  26. for (var i in res) {                                                            ④
  27. g_resources.push(res[i]);

}
上述代码第③行定义了资源集合变量g_resources,其中的第④行的for循环是将背景音乐资源文件添加到g_resources资源集合变量中。注意为了防止硬编码,我们需要在res变量中添加资源别名的声明见代码第①行和第②行。
通过的上述设置游戏应用在运行的时候加载所有资源文件,包括图片、声音、属性列表文件(plist)、字体文件(fnt)、瓦片地图文件(tmx)等。

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

  1. cc.audioEngine.playMusic(res.bgMusicSynth_mp3, true);
  2. cc.audioEngine.stopMusic(res.bgMusicSynth_mp3);

其中cc.audioEngine是cc.AudioEngine类创建的对象。
背景音乐的播放代码放置到什么地方比较适合呢?例如:在Setting场景中,主要代码如下:

  1. var SettingLayer = cc.Layer.extend({
  2. ctor:function () {
  3. this._super();
  4. cc.log("SettingLayer init");
  5. //播放代码                                                      ①
  6. return true;
  7. },
  8. onEnter: function () {
  9. this._super();
  10. cc.log("SettingLayer onEnter");
  11. //播放代码                                                          ②
  12. },
  13. onEnterTransitionDidFinish: function () {
  14. this._super();
  15. cc.log("SettingLayer onEnterTransitionDidFinish");
  16. //播放代码                                                          ③
  17. },
  18. onExit: function () {
  19. this._super();
  20. cc.log("SettingLayer onExit");
  21. //播放代码                                                          ④
  22. },
  23. onExitTransitionDidStart: function () {
  24. this._super();
  25. //播放代码                                                          ⑤
  26. }
  27. });

关于播放背景音乐,理论上我们是可以将播放代码cc.audioEngine.playMusic(res.bgMusicSynth_mp3, true)放置到三个位置(代码中的①、②、③)。下面我们分别分析一下它们还有什么不同。
1、代码放到第①行
代码放到第①行(即在ctor构造函数),如果前面场景中没有调用背景音乐停止语句,则可以正常播放背景音乐。但是如果前面场景层HelloWorldLayer onExit函数有调用背景音乐停止语句,那么会出现背景音乐播放几秒钟后停止。
为了解释这个现象,我们可以参考一下多场景切换生命周期的相关内容。使用pushScene函数从实现HelloWorld场景进入Setting场景,生命周期函数调用顺序如下图所示。

生命周期事件顺序

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

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

3、代码放到第③行
我们推荐代码放到第③行代码位置,因为onEnterTransitionDidFinish函数是在进入层而且过渡动画结束时候调用,代码放到这里不用考虑中前面场景是否有调用背景音乐停止语句。而且用户也不会先听到声音,后出现界面现象。
综上所述,是否能够成功播放背景音乐,前面场景是否有调用背景音乐停止语句有关,也与当前场景中播放代码在哪个函数里有关。如果前面场景没有调用背景音乐停止语句,问题也就简单了,我们可以将播放代码放置在代码①、②、③任何一处。但是如果前面场景调用背景音乐停止语句,在onEnterTransitionDidFinish函数播放背景音乐会更好一些。

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

  1. var HelloWorldLayer = cc.Layer.extend({
  2. ctor:function () {
  3. this._super();
  4. cc.log("HelloWorldLayer init");
  5. },
  6. onEnter: function () {
  7. this._super();
  8. cc.log("HelloWorldLayer onEnter");
  9. },
  10. onEnterTransitionDidFinish: function () {
  11. this._super();
  12. cc.log("HelloWorldLayer onEnterTransitionDidFinish");
  13. },
  14. onExit: function () {
  15. this._super();
  16. cc.log("HelloWorldLayer onExit");
  17. //停止播放代码                                                    ①
  18. },
  19. onExitTransitionDidStart: function () {
  20. this._super();
  21. //停止播放代码                                                ②
  22. }
  23. });

关于停止背景音乐播放,理论上我们是可以将停止播放代码cc.audioEngine.stopMusic(res.bgMusicSynth_mp3)放置到两个位置(代码中的①和②)。下面我们分别分析一下它们还有什么不同。

1、代码放到第①行
代码放到第①行(即在HelloWorldLayer onExit函数),如果后面场景中调用背景音乐播放,则可能导致播放背景音乐异常,但是如果在后面场景的onEnterTransitionDidFinish函数中播放背景音乐就不会有异常了。关于这个问题我们在前一节以及介绍过了。
2、代码放到第②行

代码放到第②行(即在HelloWorldLayer onExitTransitionDidStart函数),从图9-1可见,HelloWorldLayer onExitTransitionDidStart函数第一个被执行,如果我们的停止播放代码放在这里,不会对其它场景的背景音乐播放产生影响。我们推荐停止播放代码放在这里。

更多内容请关注最新Cocos图书《Cocos2d-x实战:JS卷——Cocos2d-JS开发》

本书交流讨论网站:http://www.cocoagame.net

欢迎加入Cocos2d-x技术讨论群:257760386

更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com

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

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

欢迎关注智捷iOS课堂微信公共平台,了解最新技术文章、图书、教程信息

Cocos2d-JS使用CocosDenshion引擎的更多相关文章

  1. cocos2d js jsb XMLHttpRequest 中文乱码

    1.首先讲下怎样使用XMLHttpRequest 下面所说的是在cocos2d-x 2.2.2 或者 2.3 版本号中. 首先要明确cocos2d js事实上分两个版本号,一个是html5的版本号,另 ...

  2. [No00007A]没有文件扩展".js"的脚本引擎 解决办法

    在命令行运行JScript脚本时,遇到如下的错误提示: “输入错误: 没有文件扩展“.js”的脚本引擎.” 这样的错误,原因是因为JS扩展名的文件被其他软件关联了,需要取消关联. 如系统中安装了ULT ...

  3. cocos2dx的build_win32.dat出现问题以及install-template-msvc.dat出现.js没有脚本引擎

    关于cocos2dx-2.x.x版本当中出现build_win32.bat执行失败 (针对VS2013)应当在VS的安装路径查找msbuild的文件夹,再其中查找msbuild.exe文件找到四个东西 ...

  4. Cocos2d-x中使用音频CocosDenshion引擎介绍与音频文件的预处理

    Cocos2d-x提供了一个音频CocosDenshion引擎,CocosDenshion引擎可以独立于Cocos2d-x单独使用,CocosDenshion引擎本质上封装了OpenAL音频处理库.具 ...

  5. 没有文件扩展".js"的脚本引擎 解决办法

    在命令行运行JScript脚本时,遇到如下的错误提示: “输入错误: 没有文件扩展“.js”的脚本引擎.” 这样的错误,原因是因为JS扩展名的文件被其他软件关联了,需要取消关联. 如系统中安装了ULT ...

  6. 没有文件扩展“.js”的脚本引擎问题解决

    安装MinGW的时候提示没有文件扩展".js"的脚本引擎. 原因:系统安装Dreamwear.UltraEdit.EditPlus后修改了.js文件的默认打开方式.当想直接执行js ...

  7. 没有文件扩展js的脚本引擎

    没有文件扩展js的脚本引擎 没有文件扩展js的脚本引擎怎么解决_百度经验 https://jingyan.baidu.com/article/ff42efa93a7ad9c19e2202f0.html

  8. template.js 数据渲染引擎

    template.js 数据渲染引擎 template.js是一款JavaScript模板引擎,用来渲染页面的. 原理:提前将Html代码放进编写模板 <script id="tpl& ...

  9. cocos2d js的一些tip

    cocos2d-js-v3.2-rc0 cc.director.end();//退出app cc.Application.getInstance().openURL("http://www. ...

随机推荐

  1. Codeforces Round #290 (Div. 2) C. Fox And Names dfs

    C. Fox And Names 题目连接: http://codeforces.com/contest/510/problem/C Description Fox Ciel is going to ...

  2. 为C# Windows服务添加安装程序

    最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多.像后台运行不阻塞系统,不用用户登录之类.哈哈,扯远了,今天讲一下那个怎么给Windows服务做个安 ...

  3. 使用NuGet安装EntityFramework4.2

    1.下载NuGet 有两种方式下载NuGet 第一种:在微软的档案库下载,下载地址为:http://visualstudiogallery.msdn.microsoft.com/27077b70-9d ...

  4. 【JavaScript】新浪微博ajax请求后改变地址栏url,但页面不跳转的方案解析

    新浪微博当你弹出一个视频的时候再点下一页时,原视频还在,而且地址栏的url的页数变了.对于这种网上讨论最多的方案有以下几种: 一.通过锚点Hash实现在这方面其实国内很早就有做了,比如淘宝画报,通过的 ...

  5. 关于调试程序接收通过adb发送带有参数的广播问题

    一句话,如果你检查完格式没有错:关于通过adb启动Activity.activity.service以及发送broadcast的命令 am broadcast -a myAction --es cit ...

  6. C# unix时间戳转换

    场景:由于业务需要和java 开发的xxx系统对接日志,xxx系统中用“1465195479100” 来表示时间,C# 里面需要转换做一下逻辑处理,见代码段. C#获取的unix时间戳是10位,原因是 ...

  7. MVC框架 - AJAX支持

    Ajax是异步JavaScript和XML的一个简写形式.MVC框架包含了不显眼的Ajax内置支持,通过它可以使用辅助方法,在所有的视图添加代码来定义Ajax特性. 在MVC中此特征是基于jQuery ...

  8. 【阿里云产品公测】阿里云OpenSearch初次使用评测

    作者:阿里云用户 bailimei 从一开始我就对opensearch非常陌生,这是我第一次接触它,本以为对我来说上手难度会比较大,看完帮助信息后我决定试用看看,经试用后我发现阿里云opensearc ...

  9. 《Cortex-M0权威指南》之Cortex-M0编程入门

    转载请注明来源:cuixiaolei的技术博客 嵌入式系统编程入门 微控制器是如何启动的 为了保存编译号的二进制程序代码,大多数的现代微控制器都会包含片上flash存储器.有些微控制器还可能有一个独立 ...

  10. TQ210开发板NFS挂载android4.0.4的rootfs的方法

    首先声明的是,我使用的u-boot是自己移植的u-boot2013.01.01而非天嵌官方的那个,至于使用官方的u-boot如何去实现nfs挂载rootfs我没怎么研究过,不过原理方法都是一致的. 主 ...