Cocos2d-x 背景音樂和音效

2018-08-12 21:19 更新

背景音樂和音效

整個游戲完成了,可以痛快的在電腦上打飛機了!可是感覺少了點什么?

對了,背景音樂和游戲音效。還記得最初我們在創(chuàng)建cocos2dx工程的時候有一步要勾選的選項嗎?SimpleAudioEngine!沒錯就是它。

1.音樂格式

官方文檔中是這么寫的:

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

2.背景音樂

背景音樂在整個游戲中,同一時間只能有一個。

(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

至于在游戲過程中,要在暫停,結束之類的地方哪里控制我就不說了,看你們的喜好了。

3.游戲音效

游戲音效是可以重疊的。

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

4.釋放資源

查看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的時候直接播放,這樣效率會快多了。沒理解源碼的意思,難道是攻城獅忙著打灰機沒空寫么?

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號