AKever

导航

Cocos2d-x(1) 音效引擎(CocosDenshion)

音效引擎(CocosDenshion)

 在玩游戏时,视觉触觉听觉是玩家与游戏互动的3 种形式,每一种形式都是十分重要的。实际上,在游戏中实现一套优质的音乐与音效远比制作漂亮的画面简单得多。只需要开发者完成很少的工作量,就能把游戏的互动效果提高一个层次。

  在游戏中,我们把声音分为两类第一类是音乐,这种类型的声音通常长度较长,适合作为环境音乐(例如游戏的背景音乐)。由于它的长度较长,同一时刻通常只能播放一首音乐。第二类是音效,它的特点是长度很短,但是可以同时播放多个音效,拥有很强的表现力。 

  Cocos2d-x 提供了对音乐与音效的支持,能够十分方便地实现音乐与音效的播放暂停循环功能。在这一章中,我们将简单地介绍Cocos2d-x 如何为游戏添加音乐与音效。 

1.使用音效引擎 

  Cocos2d 的音效引擎库CocosDenshion 随着引擎一同被分发。除了在游戏中使用外,音效引擎有时也会用在其他软件中。因此,虽然CocosDenshion 与游戏引擎捆绑发布,却并不属于游戏引擎的一部分。 

  在游戏开发中,我们可以十分方便地启用CocosDenshion 音效引擎库。CocosDenshion 位于 Cocos2d-x 目录下的"CocosDenshion" 目录中。通常,Cocos2d-x 项目已经包含了CocosDenshion 库,当我们需要使用音效引擎时,把引擎头文件引进来即可。 

  CocosDenshion 实现了简单易用的 SimpleAudioEngine 类。为了使用音效引擎,我们只要引入它的头文件即可: 

#include  "SimpleAudioEngine.h"  

  CocosDenshion 移植自Cocos2d-iPhone 中的同名库。实际上,Cocos2d-iPhone中的CocosDenshion 实现了3 个音效引擎,由底层到高级分别是CDSoundEngineCDAudioManagerSimpleAudioEngine,其中前两个较为底层的引擎用于高级音频的开发,例如实现3D混音等。然而,对于普通开发者而言,SimpleAudioEngine 已经足以满足大部分游戏开发的需求了。底层的音效引擎封装自OpenAL音频接口,从而实现了十分灵活、高效的音频回放引擎。然而,OpenAL 只能被OS X (包括iOS )平台支持,其他平台下是没有类似接口的,因此 Cocos2d-x 不得不舍弃 CDSoundEngine 和CDAudioManager这两个底层引擎,只保留了最常用的SimpleAudioEngine

 2.支持格式 

CocosDenshion 引擎库实际上是对系统音频 API 的封装,因此它支持的音频文件格式与平台有关。表6 -1 与表6 -2 列出了主流平台下CocosDenshion 所支持的文件格式。 

3.预加载 

3.0播放音乐与音效

SimpleAudioEngine 与许多Cocos2d 的部件一样,是一个单例类。我们使用以下代码来访问它的实例: 

SimpleAudioEngine::sharedEngine(); 

  它提供了许多与音乐和音效播放相关的方法,它们使用起来都十分简单。下面我们介绍最常用的几个方法。 

3.1预加载

  加载音乐和音效通常是一个耗时的过程,为了防止由即时加载产生的延迟导致实际播放与游戏不协调的现象发生,在播放音效和背景音乐之前,需要预加载音乐文件。通常,我们会在进入游戏场景前的载入阶段调用下面的这两个方法。  

void preloadEffect(const char* pszFilePath); //用于预加载音效文件,其中pszFilePath 为音效文件所在的目录位置。 
void preloadBackgroundMusic(const char* pszFilePath); //用于预加载背景音乐,其中 pszFilePath 为音乐文件所在的目录位置。 

3.2其他成员 

  除了以上几个常用的音频回放的相关方法,Cocos2d-x 还提供了其他十分便捷的控制方法与属性,下面简要介绍一下它们。 

方法

void rewindBackgroundMusic(); //重新播放背景音乐。 
bool isBackgroundMusicPlaying(); //返回一个布尔类型的值,表示是否正在播放背景音乐。 
void unloadEffect(const char*pszFilePath); //卸载已预载入的音效文件,以释放系统资源。pszFilePath 参数代表预载入音效文件的路径。当不再使用某个音效文件时,我们可以通过调用此函数释放资源。然而,如果再次使用此音效,引擎会再次载入该音效文件,导致消耗大量的时间。 void end(); //当不再使用音频引擎时,调用此方法来释放 SimpleAudioEngine 所占用的资源。   

属性

float EffectsVolume; //属性:获取或设置音效的音量大小,其取值为 0.0 到1.0 之间的浮点数。注意,对此属性的设置会影
响到所有音效的音量大小。 
float BackgroundMusicVolume; //属性:获取或设置背景音乐的音量大小,其取值为0.0 到1.0 之间的浮点数。与EffectsVolume
属性类似,对此属性的设置也会影响到所有背景音乐的音量大小。 

 

3.3小结 

  在这一章中,我们学习了Cocos2d-x 提供的音频引擎库CocosDenshion 。CocosDenshion 的核心是 SimpleAudioEngine,它提供了十分简单易懂的接口来控制音乐与音效的播放。下面我们回顾一下本章涉及的重要知识点。 

  SimpleAudioEngine :一个单例类,提供了跨平台的音频回放功能。 

  音乐与音效:音乐是较长的音频文件,对格式限制较少,但通常一次只能播放一首音乐;音效是较短的音频文件,对格式限制严格,但是可以同时播放许多音效。 

  预加载:加载音频文件会消耗大量的时间,如果在需要播放音效时实时加载,会导致游戏出现卡顿现象,因此,我们使用preloadEffectpreloadBackgroundMusic 方法来分别预加载音效与音乐文件。 

  音效唯一标识:在同一时刻可能播放着多个音效,因此,为了区分每一个音效,在调用 playEffect 方法播放音效时,会给即将播放的音效分配一个号码,即它的唯一标识。此后,如果需要暂停、恢复此音效的播放,或是停止播放此音效,都会使用其唯一标识来定位此音效。 

 最后,使用SimpleAudioEngine 时,应注意以下三点。

  1. 播放音效或背景音乐前,一定要提前加载音效或背景音乐文件。
  2. 在播放背景音乐时,若要切换场景,不需要手动停止背景音乐,Cocos2d-x 会自动把先前场景的背景音乐停止,并播放新场景中的背景音乐(如果新场景会播放新的背景音乐的话)。
  3. 在退出后且不再需要音乐时,要调用end 方法来释放引擎占用的资源。

 

End, thank you!!!

 

posted on 2014-01-26 14:04  AKever  阅读(1295)  评论(0)    收藏  举报