4.4 声音音效相关的经验和技巧
最后分享一些在实际工作中积累下来的声音播放相关的经验和技巧。首先是声音的管理,最好不要在代码中直接使用声音文件名,在配置表中为每个声音文件定义一个ID,可以根据游戏逻辑来定义ID的规则,当需要播放声音时,通过ID从配置表中找到声音文件的路径,然后播放,这种做法会带来极大的便利。就像我们使用配置表来管理游戏中所有的文字,当需要将程序翻译成其他语言时,需要做的工作就非常少了。
一般在我们的开发过程中,为游戏添加音效是很靠后的一个环节,添加的时候往往是找到代码中各处需要播放声音的地方,然后在里面添加一段代码,让声音播放,但这种做法很不好管理。游戏的声音播放一般有以下几种情况,进入场景时播放(背景音乐),在动画播放时播放,如玩家攻击动画,被攻击动画,或者按钮点击动画,这些动画播放的时候伴随着音效。如果我们也为动画添加相应的配置(如动画1的配置中配置了音效1),并将播放动画的接口进行封装,那么就可以在播放动画的时候自动播放音效了。
就算没有动画配置表(声音配置表还是要的),也可以通过设计ID的规则来实现音效的自动播放,如角色、子弹等对象会有多个动画,可以通过角色或子弹的ID乘以100,再加上动画的ID,来获得一个唯一ID。根据这个规则来定义声音的ID,如子弹有一个飞行动画,还有一个爆炸动画,这一发子弹的ID为100,飞行和爆炸是子弹的两种状态,分别为1和2,那么可以把子弹的飞行音效和爆炸音效的ID定义为10001和10002,在播放动画的时候,可以在播放动画的通用接口中寻找对应的音效ID,找到了就播放该音效。使用这种方法,在一个项目中,仅添加了几行代码,就实现了成百上千个音效的自动化添加(声音配置表由策划填写),如果这种方法让你感到疑惑,那么请把这种方法当作一种思路,而不是一系列的步骤。
由于需要在不同的平台使用不同的音频格式,所以需要为每个平台都准备一个目录来存放这个平台的声音文件,如soundiOS、soundAndroid、soundWin32。然后使用预处理,在不同的平台加载不同的声音配置表,最后在打包的时候将其他平台的目录移除,这是使用配置表管理声音文件的另一个好处,最关键的是大量音效的添加、移除和管理,都不需要对代码进行大量的改动了。
另外还可以结合Cocos2d-x的特性来更好地播放声音,例如,当需要延迟播放声音,那么可以使用DelayTime这个Action。如果希望远处的物体播放的声音更小,那么可以将参考节点的坐标转换成世界坐标,再判断离屏幕正中间的距离来决定声音播放时的音量,实现一个通用的声音组件来挂载到角色身上,这也许是个不错的主意。
最后如果Cocos2d-x引擎自带的声音引擎无法满足需求,还可以使用FMod这个强大的声音引擎来实现各种需求,官网地址是http://www.fmod.org/。
有兴趣的读者可参考使用fmod声音引擎的Cocos2d-x游戏示例,网址为https://github.com/fmod/EarthWarrior3D。