在介绍了CocosDenshion声音模块的组成之后,就要来看看具体的用法了。按照游戏声音的划分,先介绍背景音乐的处理方法。在下一个章节再来介绍声音音效的处理方法。希望此时,读者已经准备了一些不同格式的声音文件。在接下来的内容中,读者将有机会通过引擎来操作它们。
由于在CocosDenshion的代码结构中采用了易于使用的外观模式,开发者只需关心其上层的函数方法。这也就是类SimpleAudioEngine的函数。我们先从此类的静态函数开始介绍。
//获得SimpleAudioEngine的单例对象,将会在第一次调用时创建对象 static SimpleAudioEngine * getInstance () //释放单例对象 static void end ()
声音引擎在游戏中将会是一个单例对象。开发者可以使用函数getInstance()来调用它。如果是第一次调用,则会首先创建此对象。而函数end()是用来释放声音引擎对象的。这是在游戏退出时,必须要做的工作。
技巧:最好将函数end()写在类的析构函数当中。这样当游戏退出时,将会自动地释放声音引擎对象。
利用函数getInstance(),开发者可以在代码中任何地方获得声音引擎对象。这样的话,也就可以在游戏中任何时机来操作声音。下面来看类SimpleAudioEngine与游戏背景音乐有关的函数,见代码8-1。
代码8-1 类SimpleAudioEngine中游戏背景音乐的操作函数
//预先加载背景音乐 void preloadBackgroundMusic (const const char* pszFilePath) //播放背景音乐,参数为:音乐文件路径和名称,是否循环播放 void playBackgroundMusic (const const char* pszFilePath, bool bLoop) //播放背景音乐,参数为:音乐文件路径和名称 void playBackgroundMusic (const const char* pszFilePath) //停止背景音乐的播放,参数为:是否释放声音资源 void stopBackgroundMusic (bool bReleaseData) //停止背景音乐的播放 void stopBackgroundMusic () //暂停背景音乐的播放 void pauseBackgroundMusic () //恢复背景音乐的播放 void resumeBackgroundMusic () //回放背景音乐的播放 void rewindBackgroundMusic () //返回是否将要播放背景音乐 bool willPlayBackgroundMusic () //返回是否正在播放背景音乐 bool isBackgroundMusicPlaying () //获得当前背景音乐播放音量 float getBackgroundMusicVolume () //设置当前背景音乐播放音量 void setBackgroundMusicVolume (float volume)
代码8-1展示了类SimpleAudioEngine中游戏背景音乐的操作函数。每个函数都配有注释,只要使用过播放器的读者都会理解其含义。我们就以日常生活中的录音机为例。
(1)首先,要准备一盘磁带。这其实就是声音文件。在听取音乐之前,是不是要把磁带放到机器中?所以引擎中有一个预加载函数preloadBackgroundMusic。它主要是为了将声音文件准备好,以便在游戏中可以直接播放。
技巧:最好在游戏开始时,就将声音文件预加载,为将来的播放做好准备。
(2)然后,在磁带放入录音机后,就可以按下播放、暂停或者回放的按钮。在声音模块中同样也提供了这些方法,不再啰嗦了。
(3)最后,在听到声音的时候,人们可能会调节一下音量的大小。引擎中也提供了两个与音量大小有关的函数。
说明:与录音机相比,声明模块中还没有快进和倒退的功能。
细心读者可能会发现,所有与背景音乐有关的参数只是一个声音文件信息。这也是游戏中惯用的手法,主要在于下面两个原因。
(1)手持设备的资源有限,只有一个音道并不能同时播放多个音源。
(2)游戏里的声音大多数是由一个背景音乐加上多个声音效果组成的。
虽然在函数设计上存在限制,但并不意味着读者不可以同时播放多个背景音乐。开发者可以修改源代码来实现多个背景音乐同时播放的效果。只是由于不同平台的表现效果,很难保证能够得到预期的效果。笔者建议尽量在同一时间下,只播放一个背景音乐。与背景音乐相比,声音音效则更为灵活。下面来看声音效果在引擎中的使用方法。