音乐与音效
在游戏中实现一套优质的音乐与音效远比制作漂亮的画面简单得多。
只需要开发者完成很少的工作量,就能把游戏的互动效果提高一个层次。
CocosDenshion实现了3个音效引擎,
由底层到高级分别是
CDSoundEngine、CDAudioManager和SimpleAudioEngine
支持格式
播放音乐与音效
SimpleAudioEngine与许多Cocos2d的部件一样,是一个单例类。我们使用以下代码来访问它的实例:
SimpleAudioEngine::sharedEngine();
它提供了许多与音乐和音效播放相关的方法,它们使用起来都十分简单。下面我们介绍最常用的几个方法。
预加载
加载音乐和音效通常是一个耗时的过程,为了防止由即时加载产生的延迟导致实际播放与游戏不协调的现象发生,在播放音效和背景音乐之前,需要预加载音乐文件。通常,我们会在进入游戏场景前的载入阶段调用下面的这两个方法。
void preloadEffect(const char* pszFilePath):用于预加载音效文件,其中pszFilePath为音效文件所在的目录位置。
void preloadBackgroundMusic(const char* pszFilePath):用于预加载背景音乐,其中pszFilePath为音乐文件所在的目录位置。
播放与停止
音频引擎提供了播放与暂停音乐音效的接口,使用起来十分简便,下面介绍的方法用来实现这些功能。
unsigned int playEffect(const char* pszFilePath, bool bLoop = false):播放音效。和预加载方法的参数相同,pszFilePath表示音效文件的存放位置。bLoop参数控制是否循环播放,默认为false,即只播放一次。通常来说,音效不需要循环播放,而背景音乐需要循环播放。以下代码实现了播放金币音效的功能,音效文件名为"coin.wav":
SimpleAudioEngine::sharedEngine()->playEffect("coin.wav", false); 另外,playEffect函数会返回一个无符号整型值,是此次播放音效的唯一标识,可用于暂停此音效。
void playBackgroundMusic(const char* pszFilePath, bool bLoop = false):播放背景音乐。该方法的参数与playEffect方法的参数类似,其中pszFilePath表示音乐文件所在路径,bLoop表示是否循环播放。
void stopEffect(unsigned int nSoundId):停止播放指定的音效。nSoundId参数是将要被停止播放的音效的唯一标识,该标识是playEffect方法的返回值。
void stopAllEffects():停止播放所有音效。
void stopBackgroundMusic():停止播放背景音乐。
暂停与恢复播放
当游戏进入后台时,通常暂停播放音乐;当游戏恢复前台运行后,再继续播放音乐。下面简要介绍一下实现音乐、音效的暂停与恢复功能的方法。
void pauseBackgroundMusic():暂停播放音乐。暂停后,可以利用恢复播放方法继续播放被暂停的音乐。通常,在Cocos2d-x工程的AppDelegate类的事件处理函数中,调用此方法来暂停音乐。
void pauseEffect(unsigned int nSoundId):暂停播放指定的音效。nSoundId参数是将要被暂停的音效的唯一标识。在程序调用playEffect时,该方法会返回一个音效的唯一标识。如果想要暂停播放中的音效,需要把该音效的唯一标识传递给pauseEffect方法。下面的代码显示了如何开始播放一个音效并立刻暂停播放:
unsigned int nCoinSoundId = SimpleAudioEngine::sharedEngine()-> playEffect("coin.wav", false); SimpleAudioEngine::sharedEngine()->pauseEffect(nCoinSoundId); void pauseAllEffects():暂停所有播放中的音效。与pauseBackgroundMusic方法类似,通常在游戏暂停或进入后台时调用此方法。
void resumeBackgroundMusic():恢复音乐播放。在游戏重新进入前台时调用此方法。我们同样可以在AppDelegate提供的事件处理函数中调用此方法来恢复播放被暂停的音乐。
void resumeEffect(unsigned int nSoundId):恢复播放某一被暂停的音效。nSoundId参数是将要恢复播放的音效的唯一标识。在介绍pauseEffect时,我们曾播放金币音效,并立刻暂停此音效。当我们想要恢复金币音效时,可以执行以下代码:
SimpleAudioEngine::sharedEngine()->resumeEffect (nCoinSoundId); void resumeAllEffects():恢复所有被暂停的音效。它通常与pauseAllEffects方法成对使用。当游戏继续运行或是从后台重新回到前台时,调用此方法。
其他成员
除了以上几个常用的音频回放的相关方法,Cocos2d-x还提供了其他十分便捷的控制方法与属性,下面简要介绍一下它们。
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所占用的资源。