1. 程式人生 > >Cocos2d-x 3.0心得(04)-BGM管理

Cocos2d-x 3.0心得(04)-BGM管理

用cocos2dx播放音樂音效算是很簡單的事了,沒什麼特殊需求的話,用SimpleAudioEngine就可以搞定。不過特殊需求總是會出現的。要是你經常聽歌,應該會有印象,某些播放器在切換音樂的時候,正在播放的音樂會逐漸淡出直到消失,然後才會播放新的音樂。如果想在遊戲裡也實現類似的效果,光靠SimpleAudioEngine是不夠的。

cocos2dx裡面的音訊管理分3個層次,從高到低是SimpleAudioEngine、CDAudioManager、CDSoundEngine。當然這是官方的說法。通常一旦你用到了CDAudioManager,那麼你基本上也得使用CDSoundEngine,因為CDAudioManager主管BGM,CDSoundEngine主管音效。另外比較遺憾的是,CDAudioManager和CDSoundEngine只能在iOS上使用。當然你可以寫兩套程式碼,在iOS上實現炫酷的音訊效果,其他平臺就只能soso了。

CDAudioManager是用來管理BGM的,這從它所包裝的音訊物件類名CDLongAudioSource就可以看出來,“長音訊源”,沒什麼比BGM更合適了。而CDLongAudioSource實際是對AVAudioPlayer的包裝,AVAudioPlayer是一個不折不扣的iOS原生類,所以你明白為什麼CDAudioManager只能在iOS上用了。

CDLongAudioSource本身還算通俗易懂,載入、播放、暫停、迴圈、控制音量,該有的介面一應俱全。

CDAudioManager包含了一個CDLongAudioSource陣列,這個陣列在內部設定了固定長度為2。這意味著如果使用CDAudioManager,我們可以同時播放兩首BGM。。。嗯,這不是說我們真的要同時放兩首音樂,這是用來做其他效果的。比如說,當你準備換音樂的時候,讓第一首淡出,同時第二首淡入,這一小段時間裡,兩首音樂是同時存在的,聽起來的效果就是從第一首無縫切換到第二首。這不是很cool麼生氣


CDAudioManager在內部把CDLongAudioSource數組裡的第一個稱為“左聲道(kASC_Left)”,第二個稱為“右聲道(kASC_Right)”。但它其實跟你耳機那兩根線沒什麼關係,都能出聲。當然也可能是我沒找到在什麼地方設定,不過對於一個手機遊戲我們還是不要太苛刻了。

你可以通過下面兩個方法來載入和獲取音樂物件:

/** Loads the data from the specified file path to the channel's audio source */
-(CDLongAudioSource*) audioSourceLoad:(NSString*) filePath channel:(tAudioSourceChannel) channel;
/** Retrieves the audio source for the specified channel */
-(CDLongAudioSource*) audioSourceForChannel:(tAudioSourceChannel) channel;
至於播放控制,那就是CDLongAudioSource自己的事了。

CDAudioManager裡有一些被宣告廢棄的介面,看得出來,早期版本的CDAudioManager只能播放一首BGM。。。嘛,時代總是會進步的。

CDAudioManager除了控制BGM,還能用來做一些跟BGM相關的跨App的事。你可以給CDAudioManager設定一個模式

-(void) setMode:(tAudioManagerMode) mode;

它能做的事情包括:

只讓你的App能放BGM(kAMM_FxPlusMusic);

讓你的App到後臺還能放BGM(kAMM_MediaPlayback);

當別的播放器在放BGM時讓你的App靜音(kAMM_FxPlusMusicIfNoOtherAudio),等等。

你還可以通過

-(void) setResignBehavior:(tAudioManagerResignBehavior) resignBehavior autoHandle:(BOOL) autoHandle;
來設定當App被中斷的時候(比如說,來電話了),怎麼處理BGM:

先停止,迴游戲後繼續放(kAMRBStopPlay);
先停止,迴游戲後不放了(kAMRBStop),等等。

說了這麼多,似乎還沒講到怎麼做BGM的混合、淡入淡出。這其實沒什麼奧祕,你要做的只是控制CDLongAudioSource的音量。從1逐漸減至0,就是淡出;從0逐漸增至1,就是淡入。cocos2dx提供了一個CDLongAudioSourceFader,可以幫助你比較規範的控制這些音量。它繼承自CDPropertyModifier,看名字就知道這是用來動態控制音訊屬性的。它的作用原理跟cocos2dx的Action系列很類似,所以你應該很快就能熟悉它。只不過,這裡沒有ActionManager一類的管理器罵人所以你得自己弄一個了。