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。
音频的预处理:
无论 是播放背景音乐还是音效在播放之前进行预处理是有必要的,这个过程是对于音频文件进行解压等处理,预处理只需要在整个游戏运行过程中处理依次就可以了。如 果不进预处理,则会发现在第一次播放这个音频文件时候感觉很“卡”,用户体验不好。可以将它理解于类似于图片的异步加载
同样的原理,音频的预处理也就是提前加载进来。
CocosDenshion注意点:
在三星某些手机上,以9100为例,貌似它的音频驱动存在bug ,播放太多个音效的话程序会直接崩掉,所以在三星的机子上应该避免频繁的多个调用播放音效文件。
音频的封装:
游戏我们必不可缺少的就是用到音频播放与声音设置大小之类的,如果用到地方就获取单例调用一次貌似有点不太专业也不好管理,所以个人平时是直接把它们集中封装在一个单例类里。下面以我某个项目中的音频封装例子贴出代码举例:
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 }
大致的封装就是如此,具体根据自己的项目进行封装。这样是不是就是方便管理。只要音频文件名需要更改,只需要从音频单例里进行更改而不用处处找了。
注意:
在对SimpleAudioEngine进行使用时,必须先引用SimpleAudioEngine头文件,再而引入CocosDenshion命名空间。如果想问为什么。请默默回去把C++部分的命名空间知识点先了解清楚。
ok.关于Cocos2d的音频知识就分享到此,有讲得不对的地方还望指出进行探讨互相学习!