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,它的内容如下:
- cc.game.onStart = function(){
- cc.view.setDesignResolutionSize(1136, 640, cc.ResolutionPolicy.EXACT_FIT);
- cc.view.resizeWithBrowserSize(true);
- //load resources
- cc.LoaderScene.preload(g_resources, function () { ①
- cc.director.runScene(new HelloWorldScene());
- }, this);
- };
- cc.game.run();
其中cc.LoaderScene.preload函数可以预处理一些资源,其中g_resources是资源文件集合变量,它是在resource.js文件中定义的,resource.js文件的内容如下:
- var res = {
- //image
- On_png: "res/on.png",
- Off_png: "res/off.png",
- background_png: "res/background.png",
- start_up_png: "res/start-up.png",
- start_down_png: "res/start-down.png",
- setting_up_png: "res/setting-up.png",
- setting_down_png: "res/setting-down.png",
- help_up_png: "res/help-up.png",
- help_down_png: "res/help-down.png",
- setting_back_png: "res/setting-back.png",
- ok_down_png: "res/ok-down.png",
- ok_up_png: "res/ok-up.png",
- //plist
- //fnt
- //tmx
- //bgm
- //music
- bgMusicSynth_mp3: 'res/sound/Synth.mp3', ①
- bgMusicJazz_mp3: 'res/sound/Jazz.mp3' ②
- //effect
- };
- var g_resources = [ ③
- ];
- for (var i in res) { ④
- g_resources.push(res[i]);
}
上述代码第③行定义了资源集合变量g_resources,其中的第④行的for循环是将背景音乐资源文件添加到g_resources资源集合变量中。注意为了防止硬编码,我们需要在res变量中添加资源别名的声明见代码第①行和第②行。
通过的上述设置游戏应用在运行的时候加载所有资源文件,包括图片、声音、属性列表文件(plist)、字体文件(fnt)、瓦片地图文件(tmx)等。
播放背景音乐
背景音乐的播放与停止实例代码如下:
- cc.audioEngine.playMusic(res.bgMusicSynth_mp3, true);
- cc.audioEngine.stopMusic(res.bgMusicSynth_mp3);
其中cc.audioEngine是cc.AudioEngine类创建的对象。
背景音乐的播放代码放置到什么地方比较适合呢?例如:在Setting场景中,主要代码如下:
- var SettingLayer = cc.Layer.extend({
- ctor:function () {
- this._super();
- cc.log("SettingLayer init");
- //播放代码 ①
- return true;
- },
- onEnter: function () {
- this._super();
- cc.log("SettingLayer onEnter");
- //播放代码 ②
- },
- onEnterTransitionDidFinish: function () {
- this._super();
- cc.log("SettingLayer onEnterTransitionDidFinish");
- //播放代码 ③
- },
- onExit: function () {
- this._super();
- cc.log("SettingLayer onExit");
- //播放代码 ④
- },
- onExitTransitionDidStart: function () {
- this._super();
- //播放代码 ⑤
- }
- });
关于播放背景音乐,理论上我们是可以将播放代码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场景中,主要代码如下:
- var HelloWorldLayer = cc.Layer.extend({
- ctor:function () {
- this._super();
- cc.log("HelloWorldLayer init");
- },
- onEnter: function () {
- this._super();
- cc.log("HelloWorldLayer onEnter");
- },
- onEnterTransitionDidFinish: function () {
- this._super();
- cc.log("HelloWorldLayer onEnterTransitionDidFinish");
- },
- onExit: function () {
- this._super();
- cc.log("HelloWorldLayer onExit");
- //停止播放代码 ①
- },
- onExitTransitionDidStart: function () {
- this._super();
- //停止播放代码 ②
- }
- });
关于停止背景音乐播放,理论上我们是可以将停止播放代码cc.audioEngine.stopMusic(res.bgMusicSynth_mp3)放置到两个位置(代码中的①和②)。下面我们分别分析一下它们还有什么不同。
1、代码放到第①行
代码放到第①行(即在HelloWorldLayer onExit函数),如果后面场景中调用背景音乐播放,则可能导致播放背景音乐异常,但是如果在后面场景的onEnterTransitionDidFinish函数中播放背景音乐就不会有异常了。关于这个问题我们在前一节以及介绍过了。
2、代码放到第②行
代码放到第②行(即在HelloWorldLayer onExitTransitionDidStart函数),从图9-1可见,HelloWorldLayer onExitTransitionDidStart函数第一个被执行,如果我们的停止播放代码放在这里,不会对其它场景的背景音乐播放产生影响。我们推荐停止播放代码放在这里。
本书交流讨论网站:http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
《Cocos2d-x实战 JS卷》现已上线,各大商店均已开售:
京东:http://item.jd.com/11659698.html
欢迎关注智捷iOS课堂微信公共平台,了解最新技术文章、图书、教程信息
相关推荐
本文将详细介绍如何在 Windows 环境下使用 Visual Studio 2010 配置 Cocos2d-x 游戏引擎。Cocos2d-x 是一个跨平台的游戏引擎,可以在多种平台上运行,包括 Windows、Mac OS X、iOS、Android 等。 一、下载和安装 ...
本文将详细介绍如何在Windows 7操作系统上使用Visual Studio 2010配置并搭建Cocos2d-x开发环境。Cocos2d-x是一款跨平台的游戏开发框架,支持iOS、Android以及Windows等多平台游戏的开发。对于初学者而言,本文提供了...
5. **cocos2d.zip**和**CocosDenshion.zip**:分别是Cocos2d的核心库和音频库,它们提供了游戏开发所需的图形渲染、动画、物理引擎等功能。 6. **box2d**:这是一个物理模拟库,基于Box2D,用于实现游戏中的碰撞...
你需要将cocos2d-x源码包中的`cocos2dx`和`CocosDenshion`目录复制到新项目的目录下,同时将Debug.win32目录中的静态链接库文件移到新项目对应目录。此外,还需要将动态链接库文件从源码包的Debug.win32目录复制到新...
CocosDenshion是Cocos2d-x的音频引擎,提供音效播放、音乐播放、音效库管理等功能,让开发者能够轻松地在游戏中实现声音效果。 10. **Box2D**: Box2D是一个流行的2D物理引擎,被集成到Cocos2d-x中,用于处理物体...
5. **安装项目模板**:根据安装的Visual Studio版本运行对应的JS脚本(如InstallWizardForVS2010.js),这将为VS添加cocos2d-x项目模板。成功安装后,你可以在“新建项目”中找到创建cocos2d-x项目的选项。 6. **...
- 使用cocos2d-x提供的命令行工具或者IDE插件来创建新的游戏项目。 - 指定项目的名称、存储路径等信息。 - 选择目标平台,例如iOS、Android或其他平台。 #### 四、项目结构解析 cocos2d-x项目通常包含以下几个主要...
第1章 Cocos2D-X引擎的介绍 1 1.1 何为游戏引擎 1 1.1.1 游戏的核心—引擎 1 1.1.2 引擎的特点 2 1.1.3 知名的引擎介绍 4 1.1.4 引擎的分类 5 1.2 Cocos2D-X引擎的来历 8 1.3 引擎的版本 9 1.4 下载与安装 10 1.5 ...
通过使用Cocos2d-iphone-3,开发者可以轻松地创建动画效果、处理物理模拟、实现触摸输入响应以及管理游戏资源。 1. **场景和层管理**:在Cocos2d-iphone-3中,游戏被组织成一系列场景(Scenes),每个场景由多个层...
Cocos2d拥有活跃的开发者社区,提供了大量扩展库和教程,如CocosDenshion(音频库)、CocosBuilder(可视化编辑器)和Cocos2d-JS(JavaScript绑定)等,帮助开发者提升效率。 通过掌握以上知识点,开发者可以充分...
《Cocos2D-X游戏开发技术精解》是由刘剑卓编著的一本关于Cocos2D-X游戏引擎的专业教程,旨在帮助开发者深入理解和掌握这一强大的2D游戏开发工具。Cocos2D-X是一个跨平台的游戏开发框架,支持iOS、Android、Windows等...
3. **渲染引擎**:Cocos2d-x使用基于OpenGL的渲染引擎,提供2D图形绘制、动画处理、粒子效果等功能,支持硬件加速,确保游戏性能。 4. **动作与动画**:Cocos2d-x内置了动作和动画系统,可以轻松实现物体的移动、...
Cocos2d-x使用C++语言进行编程,同时提供了Lua和JavaScript的接口,允许开发者能够用不同语言进行开发,提高了框架的灵活性和易用性。 跨平台游戏开发意味着开发者能够在多种设备上创建统一的游戏体验,无论是在PC...
【cocos2d-x在WIN7+VS环境下配置】是一个关于在Windows 7操作系统上使用Visual Studio 2010配置cocos2d-x开发环境的教程。cocos2d-x是一个开源的游戏开发框架,主要用C++编写,支持多种平台,包括iOS、Android和...
Cocos2d最初是为Python设计的2D游戏引擎,后来发展出了多个版本,包括Cocos2d-x(C++)、Cocos2d-JS(JavaScript)和Cocos2d-iOS(Objective-C),覆盖了移动设备和桌面平台。这个框架提供了丰富的图形渲染、物理...
- 打开`cocos2d-x/cocos2d-win32.vs2008.sln`解决方案,在Visual Studio中创建新的cocos2d-win32应用项目,如"Cocos2dxSimpleGame"。 - 确保不勾选Box2D(若项目不需要物理引擎),但选择"SimpleAudioEngine in ...