cocos2d-x 音频引擎

音频引擎

在游戏中,我们把声音分为两类。

第一类是音乐,这种类型的声音通常长度较长,适合作为环境音乐(例如游戏的背景音乐)。由于它的长度较长,同一时刻通常只能播放一首音乐。

第二类是音效,它的特点是长度很短,但是可以同时播放多个音效,拥有很强的表现力。我们可以十分方便地启用CocosDenshion音效引擎库。

CocosDenshion位于Cocos2d-x目录下 的"CocosDenshion"目录中。

通常,Cocos2d-x项目已经包含了CocosDenshion库,当我们需要使用音效引擎时,把引擎头文件引进来并声明命名空间即可:

#include"SimpleAudioEngine.h"

usingnamespaceCocosDenshion;


CocosDenshion实现了简单易用的SimpleAudioEngine类。

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方法来释放引擎占用的资源。



音频高级功能

Setup 设置

SimpleAudioEngine的API非常简单,但是在游戏中使用还是有一些注意事项,尤其是在手机和平板的等移动设备中使用时。比如在多个APP中切换时应如何处理,在或者当你玩着游戏时有电话打进来又该怎么办?这些异常在制作游戏时都必须提前想好处理方法,当然幸运的是,你能想到的异常引擎都帮我们做好了,你只需使用就好。

在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
}

如果你要用SimpleAudioEngine实现背景音乐和音效,那么就需要注意别忘了去掉代码中有用代码的注释(1、2)。

你可能感兴趣的:(cocos2d-x)