Cocos2d-x 背景音樂和音效

2018-08-12 21:19 更新

背景音樂和音效

整個(gè)游戲完成了,可以痛快的在電腦上打飛機(jī)了!可是感覺少了點(diǎn)什么?

對(duì)了,背景音樂和游戲音效。還記得最初我們?cè)趧?chuàng)建cocos2dx工程的時(shí)候有一步要勾選的選項(xiàng)嗎?SimpleAudioEngine!沒錯(cuò)就是它。

1.音樂格式

官方文檔中是這么寫的:

    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下播放的。

2.背景音樂

背景音樂在整個(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é)束之類的地方哪里控制我就不說了,看你們的喜好了。

3.游戲音效

游戲音效是可以重疊的。

(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");//卸載音效

4.釋放資源

查看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ī)沒空寫么?

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)