音频引擎
在游戏中,我们把声音分为两类。
第一类是音乐,这种类型的声音通常长度较长,适合作为环境音乐(例如游戏的背景音乐)。由于它的长度较长,同一时刻通常只能播放一首音乐。
第二类是音效,它的特点是长度很短,但是可以同时播放多个音效,拥有很强的表现力。我们可以十分方便地启用CocosDenshion音效引擎库。
CocosDenshion位于Cocos2d-x目录下 的"CocosDenshion"目录中。
通常,Cocos2d-x项目已经包含了CocosDenshion库,当我们需要使用音效引擎时,把引擎头文件引进来并声明命名空间即可:
#include"SimpleAudioEngine.h"
usingnamespaceCocosDenshion;
SimpleAudioEngine是一个共享的单例对象,因此你可以在程序的任意地方调用它:
SimpleAudioEngine::getInstance();
CocosDenshion移植自Cocos2d-iPhone中的同名库。
实际上,Cocos2d-iPhone中的CocosDenshion实现了 3个音效引擎,由底层到高级分别是CDSoundEngine、CDAudioManager和SimpleAudioEngine,其中前两个较为底层 的引擎用于高级音频的开发,例如实现3D混音等。然而,对于普通开发者而言,SimpleAudioEngine已经足以满足大部分游戏开发的需求了。底 层的音效引擎封装自OpenAL音频接口,从而实现了十分灵活、高效的音频回放引擎。然而,OpenAL只能被OS X(包括iOS)平台支持,其他平台下是没有类似接口的,因此Cocos2d-x不得不舍弃CDSoundEngine和CDAudioManager这 两个底层引擎,只保留了最常用的SimpleAudioEngine。
CocosDenshion引擎库实际上是对系统音频API的封装,因此它支持的音频文件格式与平台有关。
平台音乐格式:
1, Android: mp3、mid、ogg和wav,可以播放android.media. MediaPlayer所支持的所有格式
2, iOS:aac、caf、mp3、m4a和wav,可以播放AVAudioPlayer,所支持的所有格式
3, Windows: mid、mp3和wav
平台音效格式:
1,Android:ogg和wav,对wav的支持并不完美
2, iOS:caf和wav,可以播放Cocos2d-iPhone,CocosDenshion所支持的所有格式
3, Windows:mid和wav
api介绍
//背景音乐
//预加载背景音乐,可在初始化函数init里预加载音乐到内存中
//pszFilePath:为音乐文件所在的目录位置。
virtual void preloadBackgroundMusic(const char* pszFilePath);
//播放背景音乐
//pszFilePath:需要播放的音乐文件
//bLoop:背景音乐是否循环播放,默认false,设为true就会循环播放
virtual void playBackgroundMusic(const char* pszFilePath, bool bLoop = false);
//停止背景音乐
//bReleaseData:当停止时是否清除背景音乐数据,默认是false
virtual void stopBackgroundMusic(bool bReleaseData = false);
//暂停播放背景音乐
virtual void pauseBackgroundMusic();
//继续播放背景音乐
virtual void resumeBackgroundMusic();
//重新播放背景音乐
virtual void rewindBackgroundMusic();
//返回值:如果背景音乐可以播放返回true,否则返回false
virtual bool willPlayBackgroundMusic();
//返回值:如果背景音乐正在播放返回true,否则返回false
virtual bool isBackgroundMusicPlaying();
//返回值:背景音乐的音量,范围0.0~1.0
virtual float getBackgroundMusicVolume();
//设置背景音乐的音量
//volume:音量,范围0.0~1.0
virtual void setBackgroundMusicVolume(float volume);
//音效
//预加载音效文件,可在初始化函数init里预加载音效文件到内存中
//pszFilePath:为音效文件所在的目录位置。
virtual void preloadEffect(const char* pszFilePath);
//播放音效文件
//pszFilePath:需要播放的音效文件
//bLoop:背景音乐是否循环播放,默认false,设为true就会循环播放
//pitch:频率,即播放速度的快慢,正常值为1.0,这将影响播放需要的时间
//pan:立体声效果,取值范围-1~1,当值为-1时只有左声道播放;同理,当值为1,只有右声道播放
//gain:音量,取值范围0~1,默认为1,为0时表示静音
//返回值:一个无符号整形,用来标记被播放的音效ID
virtual unsigned int playEffect(const char* pszFilePath, bool bLoop = false,
float pitch = 1.0f, float pan = 0.0f, float gain = 1.0f);
//停止音效
//nSoundId:调用playEffect时返回标记的音效ID
virtual void stopEffect(unsigned int nSoundId);
//返回值:音效的音量,范围0.0~1.0
virtual float getEffectsVolume();
//设置音效的音量
//volume:音量,范围0.0~1.0
virtual void setEffectsVolume(float volume);
//暂停音效
//nSoundId:调用playEffect时返回标记的音效ID
virtual void pauseEffect(unsigned int nSoundId);
//继续播放音效
virtual void resumeEffect(unsigned int nSoundId);
//暂停所有音效
virtual void pauseAllEffects();
//继续播放所有音效
virtual void resumeAllEffects();
//停止播放音效
virtual void stopEffect(unsigned int nSoundId);
//停止播放所有音效
virtual void stopAllEffects();
//卸载已预载入的音效文件,以释放系统资源。
//pszFilePath:预载入音效文件的路径
virtual void unloadEffect(const char* pszFilePath);
//SimpleAudioEngine的类方法,在退出后且不再需要音乐时,必须要调用end方法来释放引擎占用的资源。
static void end();
//使用SimpleAudioEngine时,应注意以下三点。
//播放音效或背景音乐前,一定要提前加载音效或背景音乐文件。
//在播放背景音乐时,若要切换场景,不需要手动停止背景音乐,Cocos2d-x会自动把先前场景的背景音乐停止,并播放新场景中的背景音乐(如果新场景会播放新的背景音乐的话)。
//在退出后且不再需要音乐时,要调用end方法来释放引擎占用的资源。
在AppDelegate.cpp中,注意以下几个方法:
// This function will be called when the app is inactive. When comes a phone call,
// it's be invoked too
void AppDelegate::applicationDidEnterBackground()
{
Director::getInstance()->stopAnimation();
// if you use SimpleAudioEngine, it must be pause
// SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); //1
}
// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground()
{
Director::getInstance()->startAnimation();
// if you use SimpleAudioEngine, it must resume here
// SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); //2
}