Fork me on GitHub

如何给你的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运行在该采样率上。

如需完整的优化,要确保所有的声音文件使用相同的采样率。

调整增益设置,使你的背景音乐与其他声音很好的融合在一起。一般来说,你需要让背景音乐安静一些。如果播放多种音效的时候听到砰啪的声音,你背景音乐的增益就过大了。

 

 

 

 

 

 

 

 

posted on 2012-05-23 10:24  pengyingh  阅读(2108)  评论(0)    收藏  举报

导航