声音音乐与背景音乐相比有着不同的内容以及实现方法。因此在类SimpleAudioEngine中存在另一套专门处理游戏中音效声音的函数。在这些函数内部也调用不同声音处理方法。见下面的代码8-2。
代码8-2 类SimpleAudioEngine中音效的操作函数
//获得当前音效的音量大小(最大值为1.0,最小值为0.0) float getEffectsVolume(); //设置音效播放的音量大小 void setEffectsVolume(float volume); //播放音效,参数为:音效文件名包含路径,是否循环播放。 //返回参数为音效的编号 unsigned int playEffect(const char* pszFilePath, bool bLoop = false); //暂停音效,参数为:暂停音效的Id void pauseEffect(unsigned int nSoundId); //暂停所有的音效 void pauseAllEffects(); //恢复音效音效,参数为:指定音效 void resumeEffect(unsigned int nSoundId); //恢复所有音效 void resumeAllEffects(); //停止音效的播放,参数为指定音效 void stopEffect(unsigned int nSoundId); //停止所有音效的播放 void stopAllEffects(); //预加载音效,参数为音效文件名包含路径 void preloadEffect(const char* pszFilePath); //卸载音效,参数为音效文件名包含路径 void unloadEffect(const char* pszFilePath);
音效的函数调用次数要比背景音乐更为频繁。比如在游戏菜单中,可能用户每点击一次按钮,都会播放一个音效。而背景音乐只是在进入菜单时,播放一次。而且单从数目上来算,音效的个数也要比背景音乐多一些。
因此上面的代码就提供了一些操作多个音效的函数。读者可以假想在游戏当中存在一个音效池,在音效池里面存放着许多的单个音效声音,它们需要被预先加载到内存当中。这是为了在播放时,能够快速的发出声音。试想一下,要是音效播放产生延迟,游戏会变得有多糟糕?
技巧:最好在游戏开始时,就将需要播放的音效预加载,不过要考虑内存的空间。
水果忍者的游戏中,玩家每次切砍水果时都会伴随着音效。音效的播放哪怕只是延迟一秒钟,就会让玩家感觉很别扭。这也是游戏中音效使用的一个特点。那就是短暂而频繁。因此引擎才会采用池的技术,来实现良好的效果。