背景音樂的播放與中止實例代碼以下:
php
[html] view plaincopyhtml
SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Jazz.mp3", true); 函數
SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Jazz.mp3"); 動畫
背景音樂的播放代碼放置到什麼地方比較適合呢?例如:在Setting場景中,主要代碼以下:網站
[html] view plaincopyspa
bool Setting::init() .net
{ orm
//播放代碼 ① htm
return true; blog
}
void Setting::onEnter()
{
Layer::onEnter();
log("Setting onEnter");
//播放代碼 ②
}
void Setting::onEnterTransitionDidFinish()
{
Layer::onEnterTransitionDidFinish();
log("Setting onEnterTransitionDidFinish");
//播放代碼 ③
}
void Setting::onExit()
{
Layer::onExit();
log("Setting onExit");
}
void Setting::onExitTransitionDidStart()
{
Layer::onExitTransitionDidStart();
log("Setting onExitTransitionDidStart");
}
void Setting::cleanup()
{
Layer::cleanup();
log("Setting cleanup");
}
關於播放背景音樂,理論上咱們是能夠將播放代碼SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3",true)放置到三個位置(代碼中的①、②、③)。下面咱們分別分析一下它們還有什麼不一樣。
一、代碼放到第①行
代碼放到第①行(即在Setting::init函數),若是前面場景中沒有調用背景音樂中止語句,則能夠正常播放背景音樂。可是若是前面場景層HelloWorld::onExit函數有調用背景音樂中止語句,那麼會出現背景音樂播放幾秒鐘後中止。
爲了解釋這個現象,咱們能夠參考一下6.3.2一節多場景切換生命週期。使用pushScene函數從實現HelloWorld場景進入Setting場景,生命週期函數調用順序以下圖所示。
從圖中可見,HelloWorld::onExit調用是在Setting::init以後,這樣當咱們在Setting::init中開始播放背景音樂後,過一會調用HelloWorld::onExit中止背景音樂播放,這樣問題就出現了。
注意 不管播放和中止的是不是同一個文件,都會出現個問題。
二、代碼放到第②行
代碼放到第②行(即在Setting::onExit函數),若是前面場景中沒有調用背景音樂中止語句,則能夠正常播放背景音樂。若是前面的場景層HelloWorld::onExit函數有背景音樂中止語句,也會出現背景音樂播放幾秒鐘後中止。緣由與代碼放到第①行狀況同樣。
三、代碼放到第③行
咱們推薦代碼放到第③行代碼位置,由於onEnterTransitionDidFinish函數是在進入層並且過渡動畫結束時候調用,代碼放到這裏不用考慮中前面場景是否有調用背景音樂中止語句。並且用戶也不會先聽到聲音,後出現界面現象。
綜上所述,是否可以成功播放背景音樂,前面場景是否有調用背景音樂中止語句有關,也與當前場景中播放代碼在哪一個函數裏有關。若是前面場景沒有調用背景音樂中止語句,問題也就簡單了,咱們能夠將播放代碼放置在代碼①、②、③任何一處。可是若是前面場景調用背景音樂中止語句,在onEnterTransitionDidFinish函數播放背景音樂會更好一些。
更多內容請關注Cocos2d-x系列圖書《Cocos2d-x實戰(卷Ⅰ):C++開發》
本書交流討論網站:http://www.cocoagame.net
歡迎加入cocos2d-x技術討論羣:25776038六、327403678