现在的位置: 首页 > 综合 > 正文

如何给你的iOS游戏加入动态背景音乐(泰然翻译组出品)

2012年10月25日 ⁄ 综合 ⁄ 共 2967字 ⁄ 字号 评论关闭

翻译:蓝羽, 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文件夹。

将如下代码放在你代码的最上面:

  1. #import "SimpleAudioEngine.h"

在初始化方法中声明

安排你的背景音乐管理器每X秒运行一次,X是你乐章的长度。

  1. [self schedule:@selector(backgroundMusicManager) interval:16];

预加载你的声音文件到内存中

  1. [[SimpleAudioEngine sharedEngine] preloadEffect:@"1.m4a"];
  2.  
  3. [[SimpleAudioEngine sharedEngine] preloadEffect:@"2.m4a"];
  4.  
  5. [[SimpleAudioEngine sharedEngine] preloadEffect:@"3.m4a"];
  6.  
  7. [[SimpleAudioEngine sharedEngine] preloadEffect:@"4.m4a"];
  8.  
  9. [[SimpleAudioEngine sharedEngine] preloadEffect:@"5.m4a"];
  10.  
  11. [[SimpleAudioEngine sharedEngine] preloadEffect:@"6.m4a"];

最后,启动音乐管理器,让其第一次运行。否则,第一次运行只会在16秒之后才发生。

  1. [self backgroundMusicManager];

你的音乐管理器方法

  1. -(void) backgroundMusicManager {
  2.  
  3. float intensity;
  4.  
  5. /*用自己的代码控制你的音乐所处的强度*/
  6.  
  7. if(intensity >=0&& intensity <0.1666f){
  8.  
  9. lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"1.m4a" pitch:1.0f pan:0.0f gain:0.35f];
  10.  
  11. }elseif(intensity >=0.1666f&& intensity <0.3333f){
  12.  
  13. lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"2.m4a" pitch:1.0f pan:0.0f gain:0.35f];
  14.  
  15. }elseif(intensity >=0.3333f&& intensity <0.5f){
  16.  
  17. lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"3.m4a" pitch:1.0f pan:0.0f gain:0.35f];
  18.  
  19. }elseif(intensity >=0.5f&& intensity <0.6666f){
  20.  
  21. lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"4.m4a" pitch:1.0f pan:0.0f gain:0.35f];
  22.  
  23. }elseif(intensity >=0.6666f&& intensity <0.8333f){
  24.  
  25. lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"5.m4a" pitch:1.0f pan:0.0f gain:0.35f];
  26.  
  27. }elseif(intensity >=0.8333f){
  28.  
  29. lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"6.m4a" pitch:1.0f pan:0.0f gain:0.35f];
  30.  
  31. }else{
  32.  
  33. lastBGSoundPlaying =[[SimpleAudioEngine sharedEngine] playEffect:@"1.m4a" pitch:1.0f pan:0.0f gain:0.35f];
  34.  
  35. }
  36.  
  37. }

记得为什么这些音轨都稍长于16秒吗?因为它们包含了回声和淡出效果。这就是我为什么用playEffect方法来替代cocosDenshion播放背景音乐方法。这样可以使音轨在精确的时间依次重叠,从而得到不错的无缝拼接效果。

你在运行这段代码前,你需要写一个新的方法来判断你的游戏目前所处的强度。在 wordSurge里,我使用了玩家剩余生命值和屏幕中气泡的数量结合因素来判断。使用玩家的生命值是合理的选择,但你的游戏是独特的,你可以在这充分发挥创造力。

补充的小窍门

你需要关注内存使用情况。如果预加载音乐后遇到了内存限制,你可能需要降低混音到单声道,或者更低的音乐采样率(kHz),比如22.050. 确保通过setMixSampleRate方法让cocosDenshion运行在该采样率上。

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

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

抱歉!评论已关闭.