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