鍍金池/ 教程/ Java/ 背景音樂(lè)和音效
游戲暫停和觸摸屏蔽
游戲場(chǎng)景過(guò)渡
碰撞檢測(cè)
跨平臺(tái)移植和廣告植入
批次渲染
觸摸事件和優(yōu)先級(jí)
背景音樂(lè)和音效
別急,先處理好CCScene和CCLayer的關(guān)系
自定義敵機(jī)精靈
UFO層特殊道具
主角的登場(chǎng)和幀動(dòng)畫(huà)
引擎坐標(biāo)系,錨點(diǎn)和背景滾動(dòng)
分?jǐn)?shù)的本地存儲(chǔ)
子彈層的處理
搞個(gè)飛機(jī)來(lái)玩玩

背景音樂(lè)和音效

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

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

1.音樂(lè)格式

官方文檔中是這么寫(xiě)的:

    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

說(shuō)是windows不支持mp3,但是實(shí)際使用的時(shí)候,發(fā)現(xiàn)mp3也是可以正常在windows下播放的。

2.背景音樂(lè)

背景音樂(lè)在整個(gè)游戲中,同一時(shí)間只能有一個(gè)。

(1)加入頭文件,使用命名空間

     #include "SimpleAudioEngine.h"
     using namespace CocosDenshion;//很多人少了這一步導(dǎo)致找不到SimpleAudioEngine

當(dāng)然也可以在使用SimpleAudioEngine時(shí)這么寫(xiě):

     CocosDenshion::SimpleAudioEngine

(2)預(yù)加載背景音樂(lè)

我們?cè)赪elcomeScene中預(yù)加載背景音樂(lè),其實(shí)這一步木有用,后面解釋到。

    SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("sound/game_music.mp3");

(3)背景音樂(lè)的其他API

    SimpleAudioEngine::sharedEngine()->playBackgroundMusic("sound/game_music.mp3",true);//開(kāi)始播放背景音樂(lè),true表示循環(huán)
    SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();//停止背景音樂(lè),這是一個(gè)缺省參數(shù)函數(shù),傳參表示是否釋放音樂(lè)文件
    SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();//暫停背景音樂(lè)
    SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();//重頭調(diào)用背景音樂(lè)
    SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying()//返回布爾型參數(shù),表示是否在放著背景音樂(lè)
    SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);//設(shè)置音量0.0-1.0

至于在游戲過(guò)程中,要在暫停,結(jié)束之類(lèi)的地方哪里控制我就不說(shuō)了,看你們的喜好了。

3.游戲音效

游戲音效是可以重疊的。

(1)一樣的頭文件和命名空間

(2)預(yù)加載音效

    SimpleAudioEngine::sharedEngine()->preloadEffect("sound/bullet.mp3");

(3)游戲音效的其他API

    SimpleAudioEngine::sharedEngine()->playEffect("sound/bullet.mp3",false);//開(kāi)始播放背景音效,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);//重新開(kāi)始音效
    SimpleAudioEngine::sharedEngine()->pauseAllEffects();//暫停全部音效
    SimpleAudioEngine::sharedEngine()->resumeAllEffects();//重新開(kāi)始全部音效
    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所指向的音樂(lè)資源釋放掉。

而我們?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);
    }

背景音樂(lè)這貨竟然是play的時(shí)候才載入。。。好吧,你贏了。。。

其實(shí)有興趣的同學(xué)可以模仿音效那樣,把preloadBackgroundMusic實(shí)現(xiàn)了(先載入內(nèi)存),然后再play的時(shí)候直接播放,這樣效率會(huì)快多了。沒(méi)理解源碼的意思,難道是攻城獅忙著打灰機(jī)沒(méi)空寫(xiě)么?

下一篇:批次渲染