整個游戲完成了,可以痛快的在電腦上打飛機了!可是感覺少了點什么?
對了,背景音樂和游戲音效。還記得最初我們在創(chuàng)建cocos2dx工程的時候有一步要勾選的選項嗎?SimpleAudioEngine!沒錯就是它。
官方文檔中是這么寫的:
Android:在android上CocosDenshion能支持的音頻格式是對應于android.media.MediaPlayer所支持的格式。
iOS:在IOS上面Cocos2d-x的CocosDenshion所支持的格式和Cocos2d-iphone中所支持的是一樣,mp3,caf是推薦的格式。
windows:.mid, .wav are supported. Note that mp3 is not supported.
Marmalade:mp3
說是windows不支持mp3,但是實際使用的時候,發(fā)現(xiàn)mp3也是可以正常在windows下播放的。
背景音樂在整個游戲中,同一時間只能有一個。
(1)加入頭文件,使用命名空間
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;//很多人少了這一步導致找不到SimpleAudioEngine
當然也可以在使用SimpleAudioEngine時這么寫:
CocosDenshion::SimpleAudioEngine
(2)預加載背景音樂
我們在WelcomeScene中預加載背景音樂,其實這一步木有用,后面解釋到。
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("sound/game_music.mp3");
(3)背景音樂的其他API
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("sound/game_music.mp3",true);//開始播放背景音樂,true表示循環(huán)
SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();//停止背景音樂,這是一個缺省參數(shù)函數(shù),傳參表示是否釋放音樂文件
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();//暫停背景音樂
SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();//重頭調(diào)用背景音樂
SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying()//返回布爾型參數(shù),表示是否在放著背景音樂
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);//設置音量0.0-1.0
至于在游戲過程中,要在暫停,結束之類的地方哪里控制我就不說了,看你們的喜好了。
游戲音效是可以重疊的。
(1)一樣的頭文件和命名空間
(2)預加載音效
SimpleAudioEngine::sharedEngine()->preloadEffect("sound/bullet.mp3");
(3)游戲音效的其他API
SimpleAudioEngine::sharedEngine()->playEffect("sound/bullet.mp3",false);//開始播放背景音效,false表示不循環(huán)
SimpleAudioEngine::sharedEngine()->stopEffect(m_nSoundId);//停止音效,可以選擇單獨停掉一個音效,這個值是由playEffect返回的
SimpleAudioEngine::sharedEngine()->stopAllEffects();//停止全部音效
SimpleAudioEngine::sharedEngine()->pauseEffect(m_nSoundId);//暫停單個音效
SimpleAudioEngine::sharedEngine()->resumeEffect(m_nSoundId);//重新開始音效
SimpleAudioEngine::sharedEngine()->pauseAllEffects();//暫停全部音效
SimpleAudioEngine::sharedEngine()->resumeAllEffects();//重新開始全部音效
SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);//設置音效音量0.0-1.0
SimpleAudioEngine::sharedEngine()->unloadEffect("sound/bullet.mp3");//卸載音效
查看SimpleAudioEngine的源碼,我們可以發(fā)現(xiàn),在preloadEffect()的時候,引擎會把音效加到
static EffectList s_List;
其中EffectList是一個map,包含了音效文件和由它獲得的一個hash值。因此載入內(nèi)存后可以提高音效的加載效率。
所以在使用結束后,要記得釋放掉音效資源,調(diào)用:
void SimpleAudioEngine::end()
就可以把s_List所指向的音樂資源釋放掉。
而我們再看看preloadBackgroundMusic()的實現(xiàn):
void SimpleAudioEngine::preloadBackgroundMusic(const char* pszFilePath)
{
}
尼瑪,竟然是空實現(xiàn)。。。負分滾粗。。。
再看playBackgroundMusic()源碼:
void SimpleAudioEngine::playBackgroundMusic(const char* pszFilePath, bool bLoop)
{
if (! pszFilePath)
{
return;
}
sharedMusic().Open(_FullPath(pszFilePath), _Hash(pszFilePath));
sharedMusic().Play((bLoop) ? -1 : 1);
}
背景音樂這貨竟然是play的時候才載入。。。好吧,你贏了。。。
其實有興趣的同學可以模仿音效那樣,把preloadBackgroundMusic實現(xiàn)了(先載入內(nèi)存),然后再play的時候直接播放,這樣效率會快多了。沒理解源碼的意思,難道是攻城獅忙著打灰機沒空寫么?
更多建議: