翻译:蓝羽, benna , outman校对:Sharyu
还记得当索尼克开始潜水时,音乐变得戏剧化的情景吗?很抱歉引起那些焦虑的回忆,但是这是动态背景音乐很好的一个例子。我将展示如何根据游戏的动作增加无缝情绪变化的音乐。
WordSurge- 一个强度上升的例子
这是我上个游戏WordSurge的做法 随着玩家形势变得来越危险,音乐也逐渐变得激烈。请观看下面的视频
用苹果的Garage Band 打造你自己的音乐
在你做任何事以前,你需要一些音乐。 打开Garage Bandand,引导你内心的铁斯托吧。注:铁斯托,国际著名DJ。
创建相等长度的乐章
目标是创建相等长度的乐章,这样游戏的声音引擎可以在它们之间无缝转换。多长不重要,但必须相等。在WordSurge游戏中,我用的是16秒的乐章,总共6乐章。
按顺序从弱到强创建每个乐章。 当你完成后,应该像下面这样,每个乐章越来越多的乐器使用。保存你的项目。
禁用标准化
在你开始保存你的乐章前,你需要告诉Garage Band不要调整音量。默认的设置将会调整需输出的音轨音量,使它尽可能大声。然而,这样会改变本章节相对于整个歌曲的响度,在Garage Band高级参数选择菜单内可以禁用标准化。
裁剪乐章和导出
高亮除了你的第一乐章外的所有东西并临时删除它们。看起来如下图:
在Share菜单,选择导出歌曲到硬盘。
设置成The high quality高品质是合适的
将文件命名为1.m4a。
注意Garage Band导出一个音频文件稍微比你想象得长一些。它包含了额外的回音和淡出效果,而且你需要让你的背景音乐听起来天衣无缝。因为你在播放这些音轨时它们之间会相互重叠,所以它们都必须同步,之后将会有更详细的说明。
撤销或者恢复到你保存之前,重新得到你歌曲的其他部分。为每个乐章重复剪切和导出过程。最后你将得到一系列的音乐,名字是1.m4a、2.m4a、3.m4a等等。
同时,返回至Xcode
我在这个游戏中使用cocos2d,这使得定时操作非常简单。而且它装载了Steve Oldmeadow超级棒的CocosDenshion声音库。
打开你的游戏项目并将你的文件拖入你项目中的Resource文件夹。
- #import "SimpleAudioEngine.h"
在初始化方法中声明
安排你的背景音乐管理器每X秒运行一次,X是你乐章的长度。
- [self schedule:@selector(backgroundMusicManager) interval:16];
预加载你的声音文件到内存中
- [[SimpleAudioEngine sharedEngine] preloadEffect:@"1.m4a"];
- [[SimpleAudioEngine sharedEngine] preloadEffect:@"2.m4a"];
- [[SimpleAudioEngine sharedEngine] preloadEffect:@"3.m4a"];
- [[SimpleAudioEngine sharedEngine] preloadEffect:@"4.m4a"];
- [[SimpleAudioEngine sharedEngine] preloadEffect:@"5.m4a"];
- [[SimpleAudioEngine sharedEngine] preloadEffect:@"6.m4a"];
最后,启动音乐管理器,让其第一次运行。否则,第一次运行只会在16秒之后才发生。
- [self backgroundMusicManager];
你的音乐管理器方法
- -(void) backgroundMusicManager {
- float intensity;
- /*用自己的代码控制你的音乐所处的强度*/
- if(intensity >=0&& intensity <0.1666f){
- lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"1.m4a" pitch:1.0f pan:0.0f gain:0.35f];
- }elseif(intensity >=0.1666f&& intensity <0.3333f){
- lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"2.m4a" pitch:1.0f pan:0.0f gain:0.35f];
- }elseif(intensity >=0.3333f&& intensity <0.5f){
- lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"3.m4a" pitch:1.0f pan:0.0f gain:0.35f];
- }elseif(intensity >=0.5f&& intensity <0.6666f){
- lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"4.m4a" pitch:1.0f pan:0.0f gain:0.35f];
- }elseif(intensity >=0.6666f&& intensity <0.8333f){
- lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"5.m4a" pitch:1.0f pan:0.0f gain:0.35f];
- }elseif(intensity >=0.8333f){
- lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"6.m4a" pitch:1.0f pan:0.0f gain:0.35f];
- }else{
- lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"1.m4a" pitch:1.0f pan:0.0f gain:0.35f];
- }
- }
记得为什么这些音轨都稍长于16秒吗?因为它们包含了回声和淡出效果。这就是我为什么用playEffect方法来替代cocosDenshion播放背景音乐方法。这样可以使音轨在精确的时间依次重叠,从而得到不错的无缝拼接效果。
你在运行这段代码前,你需要写一个新的方法来判断你的游戏目前所处的强度。在 wordSurge里,我使用了玩家剩余生命值和屏幕中气泡的数量结合因素来判断。使用玩家的生命值是合理的选择,但你的游戏是独特的,你可以在这充分发挥创造力。
补充的小窍门
你需要关注内存使用情况。如果预加载音乐后遇到了内存限制,你可能需要降低混音到单声道,或者更低的音乐采样率(kHz),比如22.050. 确保通过setMixSampleRate方法让cocosDenshion运行在该采样率上。
调整增益设置,使你的背景音乐与其他声音很好的融合在一起。一般来说,你需要让背景音乐安静一些。如果播放多种音效的时候听到砰啪的声音,你背景音乐的增益就过大了。