cocos2dx基础篇(15)——⾳乐⾳效SimpleAudioEngine 【唠叨】
本节⽐较简单,主要讲讲cocos2dx引擎中的⾳乐⾳效SimpleAudioEngine。
【致谢】
【⼩知识】
单例类:说的通俗⼀点,它就是⼀个全局静态类。第⼀次调⽤时会创建⼀个全局静态对象,整个游戏的运⾏过程中会⼀直存在,全局都可以访问。
【Demo下载】
【3.x】
(1)获取单例:sharedEngine() 改为 getInstance()
(2)实现了:⾳量的调节。
(3)修改了播放⾳效 playEffect() 的参数:
//
// 现在还不能完全⽀持所有参数,限制的功能如下:
// 在Samsung Galaxy S2上如果启⽤了OpenSL那么pitch参数⽆效;
// 在emscrippten, win32, marmalade上pitch/pan/gain参数⽆效
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
)
//
(4)其他变化不⼤。
【SimpleAudioEngine】
⾳乐⾳效是每个游戏中不可或缺的部分,⼀个好的声⾳会给玩家留下深刻的印象,当⼀听到游戏的声⾳,就会不⾃觉得说出游戏的名称
来。就像《中国好声⾳》⼀样,笔者对那⾸《斑马,斑马》印象就⾮常深刻,当然唱这⾸歌的那个妹⼦也不错。
好了,不扯了,继续学习……
1、⾳乐⾳效介绍
声⾳分为两类:背景⾳乐、⾳效。
(1)背景⾳乐:⼀般是贯穿整个游戏的⾳乐,时间长、重复次数少。
(2)⾳效:    ⼀般是很短的那种声⾳特效,如砍杀、爆炸、⾛路等,短暂但使⽤⽐较频繁。
cocos2dx是⼀个跨平台的游戏引擎,它⽀持多种声⾳格式(⽐如MP3、WAV等)。可是呢,对于不同的平台,声⾳的格式可不⼀定是统⼀的。这就需要⼤家根据不同的平台,选择合适的声⾳格式了。
根据两种声⾳的特点,其采⽤的声⾳格式也有所不同。以下列出各平台所推荐的声⾳格式(当然并不是全部⽀持的格式,如IOS中背景⾳乐除了MP3和CAF外,还可以使⽤AAC、AMR等等)。
背景⾳乐⾳效
Win32MP3、MID、WAV MID、WAV
安泽泽>崔天琪Android MP3、MID、WAV OGG
IOS MP3、CAF CAF
由此可见,背景⾳乐最适合的选择是MP3格式。虽然⾳效也可以使⽤MP3格式,但是MP3是⼀种有损的压缩格式,⽽⾳效多数是短暂⽽快速的声响,有损的压缩⽅式可能导致有些采样⾳源消失,故⾳效不推荐使⽤MP3格式。⽽每个平台的⾳效格式均不相同,故需要根据不同平台,选⽤合适的格式。
2、SimpleAudioEngine
cocos2dx为我们提供了声⾳模块CocosDenshion。⽽其中有个SimpleAudioEngine类,是我们学习研究的对象。
使⽤SimpleAudioEngine时需要引⼊头⽂件和命名空间:
//
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;
//
SimpleAudioEngine和CCDirector⼀样,也是⼀个单例类。说的通俗⼀点,它就是⼀个全局静态类。第⼀次调⽤时会创建⼀个全局静态对象,整个游戏的运⾏过程中会⼀直存在,全局都可以访问。
3、获取单例对象
SimpleAudioEngine的单例对象获取⽅法:
//
//通过SimpleAudioEngine::sharedEngine()获得
static SimpleAudioEngine* sharedEngine();
//
4、背景⾳乐的函数
相关操作:预加载、播放、停⽌、暂停、恢复、重播,以及设置⾳量等。
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
金俊秀uncommitted
//查看了内部源码,发现⾳量的设置没有实现,即⾳量永远是1.0
float getBackgroundMusicVolume();
void setBackgroundMusicVolume(float volume);
//
5、⾳效的函数
相关操作:预加载、播放、停⽌、暂停、恢复、卸载,以及设置⾳量等。
//
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
//查看了内部源码,发现⾳量的设置没有实现,即⾳量永远是1.0
float getEffectsVolume();
void setEffectsVolume(float volume);
//
6、关于预加载
加载⾳乐和⾳效通常是⼀个耗时的过程,为了防⽌由即时加载产⽣的延迟导致实际播放与游戏不协调的现象发⽣,在播放⾳效和背景⾳乐之前,记得要预加载⾳乐⽂件preload。另外需要根据不同的平台,选择不同的预加载⾳乐格式。
具体操作如下:
其中MUSIC_FILE就是⾳乐⽂件相对Resources⽂件夹的相对路径下的⽂件名。
/**
*  根据平台选择⾳乐⾳效的格式
*/
//⾳效⽂件
//Android平台只⽀持OGG的⾳效格式
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#define EFFECT_FILE        ""
#elif( CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
#define EFFECT_FILE        "music/effect1.raw"
#else
#define EFFECT_FILE        "music/effect1.wav"
#endif
/
/⾳乐⽂件
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
#define MUSIC_FILE        "music/music.mid"
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX )
#define MUSIC_FILE        ""
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
#define MUSIC_FILE        "music/background.wav"
#else
#define MUSIC_FILE        "music/background.mp3"
#endif
/**
*  预加载⾳乐⾳效
*/
//加载背景⾳乐
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);
//加载⾳效
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(EFFECT_FILE);
//
7、关于⾳量调节
我在测试调节⾳量⼤⼩的时候,惊⼈的发现:cocos2dx中的⾳量设置没有实现,即使你设置了⾳量⼤⼩也没⽤,它永远都是1.0。
所以要想调节⾳量⼤⼩,还是通过设置系统的⾳量吧……
PS:在V3.x中已经实现了⾳量的调节。
源码如下:
float SimpleAudioEngine::getBackgroundMusicVolume()
{
return 1.0;
}
void SimpleAudioEngine::setBackgroundMusicVolume(float volume)
{
}
float SimpleAudioEngine::getEffectsVolume()
{
return 1.0;
蓝朵
}
void SimpleAudioEngine::setEffectsVolume(float volume)
{
}
//
8、使⽤技巧
(1)通过SimpleAudioEngine::sharedEngine()获取单例对象,然后调⽤相关函数。
(2)当退出程序时,记得要通过如下函数来释放单例对象,释放所有声⾳资源。
//
SimpleAudioEngine::sharedEngine()->end()
//
(3)加载⾳乐和⾳效通常是⼀个耗时的过程,为了防⽌由即时加载产⽣的延迟导致实际播放与游戏不协调的现象发⽣,在播放⾳效和背景⾳乐之前,记得要预加载⾳乐⽂件preload。
【代码实战】
代码来源于cocos2dx的官⽅项⽬TestCpp中。
1、资源⽂件
将⾳乐⾳效⽂件资源放在项⽬的“Resources\music”⽬录下。
资源来⾃官⽅项⽬TestCpp中。