翻譯:藍羽, 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運行在該採樣率上。
如需完整的最佳化,要確保所有的音效檔使用相同的採樣率。
調整增益設定,使你的背景音樂與其他聲音很好的融合在一起。一般來說,你需要讓背景音樂安靜一些。如果播放多種音效的時候聽到砰啪的聲音,你背景音樂的增益就過大了。