如何给你的iOS游戏加入动态背景音乐
转自:http://article.ityran.com/archives/1024
翻译:蓝羽, 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]; } else if (intensity >= 0.1666f && intensity < 0.3333f) { lastBGSoundPlaying = [[SimpleAudioEngine sharedEngine] playEffect:@"2.m4a" pitch:1.0f pan:0.0f gain:0.35f]; } else if (intensity >= 0.3333f && intensity < 0.5f) { lastBGSoundPlaying = [[SimpleAudioEngine sharedEngine] playEffect:@"3.m4a" pitch:1.0f pan:0.0f gain:0.35f]; } else if (intensity >= 0.5f && intensity < 0.6666f) { lastBGSoundPlaying = [[SimpleAudioEngine sharedEngine] playEffect:@"4.m4a" pitch:1.0f pan:0.0f gain:0.35f]; } else if (intensity >= 0.6666f && intensity < 0.8333f) { lastBGSoundPlaying = [[SimpleAudioEngine sharedEngine] playEffect:@"5.m4a" pitch:1.0f pan:0.0f gain:0.35f]; } else if (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运行在该采样率上。
调整增益设置,使你的背景音乐与其他声音很好的融合在一起。一般来说,你需要让背景音乐安静一些。如果播放多种音效的时候听到砰啪的声音,你背景音乐的增益就过大了。

浙公网安备 33010602011771号