Cocos2dx学习笔记(27)——音效SimpleAudioEngine

想要做一个游戏,游戏的音效可不能少。

本文仅供个人记录和复习,不用于其他用途

音效类

该类是一个单例类,可以在任意的地方加载和播放音乐。

3.x版本改变

  • sharedEngine()改为getInstance()
  • 实现了音量调节的功能
  • 修改了播放音效playEffect()的参数
1
2
3
4
5
6
7
virtual unsigned int playEffect (
const char* pszFilePath, // 音效文件的路径
bool bLoop = false, // 是否循环播放,默认为false,不循环
float pitch = 1.0f, // 频率,正常情况下为1.0,在播放时也可以改变该值
float pan = 0.0f, // 声道,范围为-1到1,为-1时表示只有左声道,为1时表示只有右声道
float gain = 1.0f // 音量增益, 范围为0到1,默认值为1
)

音乐文件类型

这里分为两种声音:背景音乐和音效。背景音乐一般是贯穿整个游戏,时间长重复少,而音效类似于爆炸、击打等等短暂但很频繁的声音。下面罗列了各个平台支持的音乐文件类型:

  • win32:背景音乐MP3MIDWAV,音效MIDWAV
  • Android:背景音乐MP3MIDWAV,音效OGG
  • IOS:背景音乐MP3CAF,音效CAF

虽然MP3可以用于背景音乐,但是用于音效时还是有损音质,所以最好根据平台来选择文件类型。

引入头文件

使用SimpleAudioEngine类需要引入头文件以及命名空间:

1
2
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;

获取单例对象

1
static SimpleAudioEngine* sharedEngine();

背景音乐的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void preloadBackgroundMusic('音乐路径const char*'); // 预加载
void playBackgroundMusic('音乐路径const char*', bool bLoop = false); // 播放,是否循环,默认不循环
void stopBackgroundMusic(bool bReleaseData = false); // 停止,是否释放音乐资源
void pauseBackgroundMusic(); // 暂停
void resumeBackgroundMusic(); // 恢复
void rewindBackgroundMusic(); // 重播
// 返回是否将要播放背景音乐
bool willPlayBackgroundMusic();
// 返回是否正在播放背景音乐
// 注意:暂停也算正在播放,只有停止了才算未播放。
bool isBackgroundMusicPlaying();
// 设置音量,取值范围0~1.0
// 在2.x中,调节音量永远是1.0,只有在3.x中才实现了这一功能
float getBackgroundMusicVolume();
void setBackgroundMusicVolume(float volume);

音效的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void preloadEffect('音乐路径const char*'); // 预加载
unsigned int playEffect('音乐路径const char*', bool bLoop = false); // 播放,返回该音效的ID。是否循环
void stopEffect(unsigned int nSoundId); // 停止指定ID的音效
void stopAllEffects(); // 停止所有音效
void pauseEffect(unsigned int nSoundId); // 暂停指定ID的音效
void pauseAllEffects(); // 暂停所有音效
void resumeEffect(unsigned int nSoundId); // 恢复指定ID的音效
void resumeAllEffects(); // 恢复所有音效
void unloadEffect(const char* pszFilePath); // 卸载音效资源
// 设置音量,取值范围0~1.0
// 在2.x中,调节音量永远是1.0,只有在3.x中才实现了这一功能
float getEffectsVolume();
void setEffectsVolume(float volume);

预加载

一般来说,在游戏的初始化过程中就要加载这些声音文件:

1
2
// MUSIC_FILE是文件的路径
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);

音乐的释放

游戏结束时通过下面的方法释放音乐资源:

1
SimpleAudioEngine::sharedEngine()->end()