Cocos2d-x提供了一個音頻CocosDenshion引擎,CocosDenshion引擎能夠獨立於Cocos2d-x單獨使用,CocosDenshion引擎本質上封裝了OpenAL音頻處理庫。具體使用的API是SimpleAudioEngine。在大多數平臺上,cocos2d-x能夠調用不一樣的SDK API來播放背景音樂和音效。CocosDenshion音頻引擎只能在同一時間只能播放一首背景音樂,可是能同時播放許多音效。下面列舉CocosDenshion引擎下的SimpleAudioEngine的幾個經常使用函數:異步
void preloadBackgroundMusic (const char *pszFilePath) 預處理背景音樂文 void preloadEffect(sound/Blip.wav);預處理音效文件 void playBackgroundMusic (const char *pszFilePath) 播放背景音樂。
void stopBackgroundMusic () 中止播放背景音樂。
void pauseBackgroundMusic () 暫停播放背景音樂。 void resumeBackgroundMusic () 繼續播放背景音樂。
bool isBackgroundMusicPlaying () 判斷背景音樂是否在播放。
unsigned int playEffect (const char *pszFilePath) 播放音效。 void pauseEffect (unsigned int nSoundId) 暫停播放音效,參數nSoundId 是playEffect函數返回ID。 void pauseAllEffects () 暫停全部播放音效。 void resumeEffect (unsigned int nSoundId) 繼續播放音效,參數nSoundId 是playEffect函數返回ID。
void resumeAllEffects () 繼續播放全部音效。 void stopEffect (unsigned int nSoundId) 中止播放音效,參數nSoundId 是playEffect函數返回ID。
void stopAllEffects () 中止全部播放音效。
void preloadEffect (const char *pszFilePath) 預處理音效音頻文件,將壓縮格式的文件進行解壓處理,如MP3解壓爲WAV。
音頻的預處理:函數
無論 是播放背景音樂仍是音效在播放以前進行預處理是有必要的,這個過程是對於音頻文件進行解壓等處理,預處理只須要在整個遊戲運行過程當中處理依次就能夠了。如 果不進預處理,則會發如今第一次播放這個音頻文件時候感受很「卡」,用戶體驗很差。能夠將它理解於相似於圖片的異步加載學習
一樣的原理,音頻的預處理也就是提早加載進來。spa
CocosDenshion注意點:code
在三星某些手機上,以9100爲例,貌似它的音頻驅動存在bug ,播放太多個音效的話程序會直接崩掉,因此在三星的機子上應該避免頻繁的多個調用播放音效文件。blog
音頻的封裝:遊戲
遊戲咱們必不可缺乏的就是用到音頻播放與聲音設置大小之類的,若是用到地方就獲取單例調用一次貌似有點不太專業也很差管理,因此我的平時是直接把它們集中封裝在一個單例類裏。下面以我某個項目中的音頻封裝例子貼出代碼舉例:圖片
1 //頭文件部分 2 class Audio 3 { 4 public: 5 static Audio* getInstance(); 6 //析構單例 7 ~Audio(); 8 //預處理音頻 9 void preloadAudio(); 10 //播放背景音樂 11 void playBgMusic(); 12 //播放音效 13 void playJump(); 14 void playAttack(); 15 void playHit(); 16 void playClickd(); 17 void playGameOver(); 18 //設置背景音樂大小 19 void setMusicVol(float vol); 20 //設置音效大小 21 void setEffectVol(float vol); 22 //中止全部音頻播放 23 void stopSound(); 24 float musicVom=50; 25 float effectVom=50; 26 private: 27 static Audio* instance; 28 };
1 //cpp部分 2 #include "Audio.h" 3 #include <SimpleAudioEngine.h> 4 #include <cocos2d.h> 5 using namespace CocosDenshion; 6 Audio* Audio::instance =nullptr; 7 Audio* Audio::getInstance() 8 { 9 if (instance ==nullptr) 10 { 11 instance =new Audio(); 12 } 13 return instance; 14 } 15 16 Audio::~Audio() 17 { 18 if (instance !=nullptr) 19 { 20 delete instance; 21 instance =nullptr; 22 } 23 } 24 void Audio::preloadAudio() 25 { 26 //加載音頻 27 SimpleAudioEngine::getInstance()->preloadEffect("attack.mp3"); 28 SimpleAudioEngine::getInstance()->preloadEffect("game-over.mp3"); 29 SimpleAudioEngine::getInstance()->preloadEffect("hit.mp3"); 30 SimpleAudioEngine::getInstance()->preloadEffect("jump.mp3"); 31 SimpleAudioEngine::getInstance()->preloadEffect("pain.mp3"); 32 SimpleAudioEngine::getInstance()->preloadEffect("button.mp3"); 33 34 } 35 void Audio::playBgMusic() 36 { 37 //播放背景音樂 38 // SimpleAudioEngine::getInstance()->playBackgroundMusic("bg.mp3",true); 39 } 40 void Audio::playGameOver() 41 { 42 //播放音效 43 SimpleAudioEngine::getInstance()->playEffect("game-over.mp3"); 44 } 45 void Audio::playJump() 46 { 47 SimpleAudioEngine::getInstance()->playEffect("jump.mp3"); 48 } 49 void Audio::playAttack() 50 { 51 SimpleAudioEngine::getInstance()->playEffect("attack.mp3"); 52 } 53 void Audio::playHit() 54 { 55 SimpleAudioEngine::getInstance()->playEffect("hit.mp3"); 56 } 57 void Audio::playClickd() 58 { 59 SimpleAudioEngine::getInstance()->playEffect("button.mp3"); 60 } 61 void Audio::setMusicVol(float vol) 62 { 63 SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(vol); 64 } 65 void Audio::setEffectVol(float vol) 66 { 67 SimpleAudioEngine::getInstance()->setEffectsVolume(vol); 68 } 69 void Audio::stopSound() 70 { 71 SimpleAudioEngine::getInstance()->stopAllEffects(); 72 SimpleAudioEngine::getInstance()->stopBackgroundMusic(); 73 }
大體的封裝就是如此,具體根據本身的項目進行封裝。這樣是否是就是方便管理。只要音頻文件名須要更改,只須要從音頻單例裏進行更改而不用到處找了。ip
注意:ci
在對SimpleAudioEngine進行使用時,必須先引用SimpleAudioEngine頭文件,再而引入CocosDenshion命名空間。若是想問爲何。請默默回去把C++部分的命名空間知識點先了解清楚。
ok.關於Cocos2d的音頻知識就分享到此,有講得不對的地方還望指出進行探討互相學習!