游戏中音频的处理也是非常重要的,它分为背景音乐播放与音效播放。
背景音乐是长时间循环播放的,它会长时间占用较大的内存,背景音乐不能多个同时播放。
而音效是短的声音,它占用内存较小,音效能多个同时播放。
在Cocos2d-JS中提供了一个音频引擎—AudioEngine,通过引擎能够很好地控制游戏背景音乐与音效优化播放。
Cocos2d-JS音频文件
音频多媒体文件主要是存放音频数据信息,音频文件在录制的过程中把声音信号通过音频编码变成音频数字信号保存到某种格式文件中。在播放过程中再对音频文件解码,解码出的信号通过扬声器等设备可以转成音波。音频文件在编码的过程中数据量很大,所以有的文件格式对于数据进行了压缩。
音频文件可以分为:
(1)无损格式,是非压缩数据格式,文件很大,一般不适合移动设备。如WAV、AU、APE等文件。
(2)有损格式,对于数据进行了压缩,压缩后丢掉了一些数据,如MP3、WMA等文件。
1.WAV文件
WAV文件目前是最流行的无损压缩格式。WAV文件的格式灵活,可以存储多种类型的音频数据。由于文件较大,不太适合于移动设备这些存储容量小的设备。
2.MP3文件
MP3格式现在非常流行,MP3是一种有损压缩格式,它尽可能去掉人耳无法感觉的部分和不敏感的部分。
3.WMA文件
WMA格式是微软发布的文件格式,也是有损压缩格式,它与MP3格式不分伯仲。在低比特率渲染情况下,WMA格式显示出来比MP3更多的优点,压缩比MP3更高,音质更好。
4.CAFF文件
CAFF文件是苹果开发的专门用于Mac OS X和IOS系统无压缩音频格式。它被设计来替换老的WAV格式。
5.AIFF文件
AIFF文件是苹果开发的专业音频文件格式。AIFF的压缩格式是AIFF-C,将数据4:1压缩率进行压缩,专门给应用于Mac OS X和IOS系统。
6.MID文件
MID文件是MIDI格式,专业音频文件格式,允许数字合成器和其他设备交换数据。MID文件主要用于原始乐器作品、流行歌曲的业余表演、游戏音轨以及电子贺卡等。
7.Ogg文件
Ogg文件全称OggVobis,是一种新的音频压缩格式,类似于MP3等的音乐格式,Ogg是完全免费、开发和没有专利限制的。Ogg文件格式可以不断地进行大小和音质的改良,而不影响旧有的编码器或播放器。
Cocos2d-JS跨平台音频支持
Cocos2d-JS与Cocos2d-iphone不同,它是为跨平台而设计的游戏引擎,它不仅可以通过Cocos2d-x JSB在移动平台上运行,还可以通过Cocos2d-html在Web平台中运行,Cocos2d-x JSB是本地技术Cocos2d-x能够支持的音乐与音效文件。Cocos2d-JS也是支持的,
Cocos2d-JS对于背景音乐播放各个平台格式支持如下:
(1)Android平台支持与android.media,MediaPlayer所支持的格式相同。
andriod.media,MediaPlayer是Android多媒体播放类。
(2)IOS平台下支持推荐使用MP3和CAFF格式
(3)Windows平台支持MIDI、WAV和MP3格式
(4)Windows Phone8平台支持MIDI和WAV格式
(5)Web平台要依赖于具体的浏览器,如果支持HTML5,一般也会支持Ogg和MP3格式,可以是纯音频的MP4和M4A,但是使用之前需要进行测试。
Cocos2d-JS对于音效播放各个平台格式支持如下:
(1)Android平台支持Ogg和WAV文件,但最好是Ogg文件
(2)IOS平台下支持推荐使用CAFF格式
(3)Windows平台支持MIDI、WAV
(4)Windows Phone8平台支持MIDI和WAV格式
(5)Web平台要依赖于具体的浏览器,如果支持HTML5,一般也会支持WAV格式,但是使用之前需要进行测试。
使用AudioEngine引擎
Cocos2d-JS提供了一个音频AudioEngine引擎。具体使用的API是cc.AudioEngine.cc.AudioEngine有几个常用的函数:
(1)playMusic(url,loop)播放背景音乐,参数url是播放文件的路径,参数loop控制是否循环播放,默认情况下为false
(2)stopMusic() 停止播放背景音乐
(3)pauseMusic() 暂停播放背景音乐
(4)resumeMusic() 继续播放背景音乐
(5)isMusicPlaying() 判断背景音乐是否在播放
(6)playEffect(url,loop)播放音效,参数同playMusic函数
(7)pauseAllEffects暂停所有播放音效。参数audioID是playEffect函数返回ID
(8)pauseAllEffects()暂停所有播放音效
(9)resumeEffect(audioID)继续播放音效,参数audioID是playEffect函数返回ID
(10)resumeAllEffects()继续播放所有音效
(11)stopEffect(audioID)停止播放音效,参数audioID是playEffect函数返回ID
(12)stopAllEffects()停止所有播放音效
音频文件的预处理
无论播放背景音乐还是音效在播放之前进行预处理都是有必要的。如果不进行预处理,则会发现在第一次播放这个音频文件时感觉很“卡”,用户体验不好。Cocos2d-JS中提供了资源文件的预处理功能。
cc.LoaderScene.preload(g_resource,funcion(){
cc.director.runScene(new HelloWorldScene());},this);};
cc.LoaderScene.preload函数可以预处理一些资源;g_resources是资源文件集合变量,它是在resource.js文件中定义的。resource.js文件的内容如下:
关于播放背景音乐,理论上是可以将播放代码cc.audioEngine.playMusic(res.bgMusicSynth_mp3,true)放置到三个位置(代码中的第1,2,3行)
1.代码放到第1行
代码放到第1行,如果前面场景中没有调用背景音乐停止语句,则可以正常播放背景音乐。但是如果前面场景层HelloWorldLayeronExit函数有调用背景音乐停止语句,那么背景音乐播放几秒钟会停止。
注意:无论播放和停止的是否是同一个文件,都会出现这个问题。
2.代码放到第2行
代码放到第2行(即在SettingLayer onEnter),如果前面场景中没有调用背景音乐停止语句,则可以正常播放背景音乐,如果前面的场景层HelloWorldLayeronExit函数有背景停止音乐,也会出现背景音乐播放几秒钟后停止的现象。
3.代码放到第3行
推荐代码都放到第3行代码位置,因为onEnterTransitionDidFinish函数是在进入层而且过渡动画结束时调用,代码放到这里不用考虑前面场景是否有调用背景音乐停止音乐语句。而且也不会出现用于先听到声音,后出现界面的现象。
综上所述,是否能够成功播放背景音乐与前面场景是否有调用背景音乐停止语句有关。也与当前场景中播放代码在哪个函数里面有关。如果前面场景没有调用背景音乐停止语句,问题也就简单了。可以将播放代码放置在代码第1,2,3行任何一处,但是如果前面场景调用背景音乐停止语句,在onEnterTransitionDidFinish函数播放背景音乐会更好一些。
停止播放背景音乐
停止背景音乐播放代码放置到什么位置比较合适呢?
关于停止背景音乐播放,理论上是可以将停止播放代码cc.audioEngine,stopMusic(res.bgMusicSynth_mp3)放置到两个位置(代码中的第1行和2行)
1.代码放到第1行
代码放到第1行,如果后面场景中调用背景音乐播放,则可能导致播放背景音乐异常,但是如果在后面场景的onEnterTransitionDidFinish函数中播放背景音乐就不好有异常。
2.代码放到第2行
代码放到第2行,即在HelloWorldLayer onExitTransitionDidStart函数。这个函数第一个被执行,如果停止播放代码放在这里,不会对其他场景的背景音乐播放产生影响,推荐停止播放代码放在这里。
实例:
设置背景音乐和音效
第一步:重新修改resource.js文件。
第二步:实现
第1行代码var audioEngine=cc.audioEngine声明并初始化全局变量audioEngine,由于cc.audioEngine采用单例设计,audioEngine保存了cc.audioEngine单例对象。
第2行代码var isEffectPlay=true声明全局变量isEffectPlay.isEffectPlay表示音效是否可以播放。
代码第3,4,5行audioEngine(res.effectBlip_wav)是在单机菜单时播放音效。代码第6,7行audioEngine.playMusic(res.bgMusicSynth_mp3,true)播放背景音乐