在游戏中,我们把声音分为两类。第一类是音乐,这种类型的声音通常长度较长,适合作为环境音乐(例如游戏的背景音乐)。由于它的长度较长,同一时刻通常只能播放一首音乐。第二类是音效,它的特点是长度很短,但是可以同时播放多个音效,拥有很强的表现力。
在游戏开发中,我们可以十分方便地启用CocosDenshion音效引擎库。CocosDenshion位于Cocos2d-x目录下的"CocosDenshion"目录中。通常,Cocos2d-x项目已经包含了CocosDenshion库,当我们需要使用音效引擎时,把引擎头文件引进来即可。
CocosDenshion实现了简单易用的SimpleAudioEngine类。为了使用音效引擎,我们只要引入它的头文件即可:
#include "SimpleAudioEngine.h"
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
SimpleAudioEngine与许多Cocos2d的部件一样,是一个单例类。我们使用以下代码来访问它的实例:
SimpleAudioEngine::sharedEngine();
加载音乐和音效通常是一个耗时的过程,为了防止由即时加载产生的延迟导致实际播放与游戏不协调的现象发生,在播放音效和背景音乐之前,需要预加载音乐文件。通常,我们会在进入游戏场景前的载入阶段调用下面的这两个方法。
1,,void preloadEffect(const char* pszFilePath):用于预加载音效文件,其中pszFilePath为音效文件所在的目录位置。
2,void preloadBackgroundMusic(const char* pszFilePath):用于预加载背景音乐,其中pszFilePath为音乐文件所在的目录位置。
void rewindBackgroundMusic():重新播放背景音乐。
bool isBackgroundMusicPlaying():返回一个布尔类型的值,表示是否正在播放背景音乐。
void unloadEffect(const char*pszFilePath):卸载已预载入的音效文件,以释放系统资源。pszFilePath参数代表预载入音效文件的路径。当不再使用某个音效文件时,我们可以通过调用此函数释放资源。然而,如果再次使用此音效,引擎会再次载入该音效文件,导致消耗大量的时间。
float EffectsVolume属性:获取或设置音效的音量大小,其取值为0.0到1.0之间的浮点数。注意,对此属性的设置会影响到所有音效的音量大小。
float BackgroundMusicVolume属性:获取或设置背景音乐的音量大小,其取值为0.0到1.0之间的浮点数。与EffectsVolume属性类似,对此属性的设置也会影响到所有背景音乐的音量大小。
void end():当不再使用音频引擎时,调用此方法来释放SimpleAudioEngine所占用的资源。
最后,使用SimpleAudioEngine时,应注意以下三点。
播放音效或背景音乐前,一定要提前加载音效或背景音乐文件。
在播放背景音乐时,若要切换场景,不需要手动停止背景音乐,Cocos2d-x会自动把先前场景的背景音乐停止,并播放新场景中的背景音乐(如果新场景会播放新的背景音乐的话)。
在退出后且不再需要音乐时,要调用end方法来释放引擎占用的资源。