你的游戏肯定会需要音乐和音效!Cocos2d-x 提供了一个 SimpleAudioEngine 类支持游戏内的音乐和音效。它可以被用来增加背景音乐,控制游戏音效。
SimpleAudioEngine 是一个共享的单例对象,你可以在代码中的任何地方通过很简单的方式获取到。
先来了解一下支持的文件格式。
补充:若此部分出现报错,尝试在代码头部增加
USING_NS_CC //在HelloWorld.h中加入(含标识符
支持的音乐格式:
平台 | 支持的常见文件格式 | 备注 |
---|---|---|
Android | mp3, mid, ogg, wav | 可以播放android.media.MediaPlayer所支持的所有格式 |
iOS | aac, caf, mp3, m4a, wav | 可以播放AVAudioPlayer所支持的所有格式 |
Windows | mid, mp3, wav | 无 |
支持的音效格式:
平台 | 支持的常见文件格式 | 备注 |
---|---|---|
Android | ogg, wav | 对wav的支持不完美 |
iOS | caf, m4a | 可以播放Cocos2d-iPhone CocosDesion所支持的所有格式 |
Windows | mid, wav | 无 |
播放背景音乐
通过下面的方式,播放一个音频文件作为背景音乐,可以控制背景音乐是否循环播放。
注意,同一时间只能出现一个背景音乐
#include "SimpleAudioEngine.h" //注意头文件
using namespace CocosDenshion; //注意命名空间
auto audio = SimpleAudioEngine::getInstance();
// 设置背景音乐并且连续循环
audio->playBackgroundMusic("mymusic.mp3", true);
// 设置背景音乐但只播放一次
audio->playBackgroundMusic("mymusic.mp3", false);
播放音效
通过下面的方式,将一个音频文件作为音效。
注意,音效可以叠加
#include "SimpleAudioEngine.h" //注意头文件
using namespace CocosDenshion; //注意命名空间
auto audio = SimpleAudioEngine::getInstance();
// 播放音效,并且只播放一次,
//参数为文件路径,是否循环,音频频率(默认1),左右声道平衡(默认0,若为1,则全部为右声道),音量大小
audio->playEffect("myEffect.mp3", false, 1.0f, 1.0f, 1.0f);
声音控制
开始播放音乐和音效后,你可能需要对它们进行一些控制,比如暂停、停止、恢复。这很容易完成,下面介绍:
暂停
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;
auto audio = SimpleAudioEngine::getInstance();
// 暂停背景音乐
audio->pauseBackgroundMusic();
// 暂停音效
audio->pauseEffect();
// 暂停所有音频
audio->pauseAllEffects();
停止
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;
auto audio = SimpleAudioEngine::getInstance();
// 停止播放(再次播放时重新开始)
audio->stopBackgroundMusic();
// 停止音效
audio->stopEffect();
// 停止所有音频
audio->stopAllEffects();
恢复
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;
auto audio = SimpleAudioEngine::getInstance();
// 恢复背景音乐(注意,只有当上一步操作为暂停时,才能从播放暂停位置恢复)
audio->resumeBackgroundMusic();
// 恢复音效
audio->resumeEffect();
// 恢复所有音频
audio->resumeAllEffects();
控制音量
建议在导入项目资源之前,就在相关非编软件中,确定某些音效的分贝大小
//获得背景音乐音量
float getBackgroundMusicVolume();
//设置背景音乐音量
void setBackgroundMusicVolume(float volume);
//获得音效音量
float getEffectsVolume();
//设置音效音量
void setEffectsVolume(float volume);
注意:如果要再win32平台上使用音量参数,我们需要增加相关的代码,因为cocos2d-x引擎并且给win32平台适配修改音量大小的函数内容
操作步骤:
- 修改
**项目路径\cocos2d\cocos\audio\win32\**
目录下的MciPlayer.h
文件 - 打开
MciPlayer.h
文件,添加头文件**#include <Digitalv.h>**
在
MciPlayer.h
文件中,增加以下代码public: //这个public是表示放入public之中,复制时不要包括public void Volume(UINT volume) { if (!_dev) return; MCI_DGV_SETAUDIO_PARMS mciParams = { 0 }; mciParams.dwItem = MCI_DGV_SETAUDIO_VOLUME; mciParams.dwValue = volume; mciSendCommand(_dev, MCI_SETAUDIO, MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)&mciParams); } UINT MciPlayer::Volume() const { if (!_dev) return 0; MCI_STATUS_PARMS mciParams = { 0 }; mciParams.dwItem = MCI_DGV_STATUS_VOLUME; mciSendCommand(_dev, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&mciParams); return mciParams.dwReturn; }
在我们代码中的
->playBackgroundMusic()
函数上右键,选择转到定义
这时,我们会发现,这个函数体中是空的,官方并没有写出这里的代码,所以我们加上
void SimpleAudioEngine::setBackgroundMusicVolume(float volume) { sharedMusic().Volume((UINT)(volume * 1000.0)); //增加这一句代码 }
其余的函数也可以响应的补充代码 ```cpp ////////////////////////////////////////////////////////////////////////// // volume interface //////////////////////////////////////////////////////////////////////////
float SimpleAudioEngine::getBackgroundMusicVolume() { return sharedMusic().Volume() / 1000.0f; }
void SimpleAudioEngine::setBackgroundMusicVolume(float volume) { sharedMusic().Volume((UINT)(volume * 1000.0)); }
float SimpleAudioEngine::getEffectsVolume() { return sharedList().at(0)->Volume() / 1000.0f; }
void SimpleAudioEngine::setEffectsVolume(float volume) { EffectList::iterator iter; for (iter = sharedList().begin(); iter != sharedList().end(); iter++) { iter->second->Volume((UINT)(volume * 1000.0)); } }
![image.png](https://cdn.nlark.com/yuque/0/2021/png/21494814/1626336590358-8efa3007-5cae-4952-af25-4777b79fccfe.png#clientId=u252489ac-27d0-4&from=paste&height=415&id=uf3567a09&margin=%5Bobject%20Object%5D&name=image.png&originHeight=415&originWidth=587&originalType=binary&ratio=1&size=20260&status=done&style=none&taskId=u392331ad-6d0c-418e-b5af-2fa2ef29575&width=587)<br />修改效果如图所示,然后,我们的场景中,就可以设置以及获得音效的声音大小了
<a name="FTWnh"></a>
## 其余函数
```cpp
void rewindBackgroundMusic(); //重新播放背景音乐
bool isBackgroundMusicPlaying(); //判断背景音乐是否在播放
//预处理函数,因为声音文件可能比较大,所以有可能播放时没有立马播放,比如主角受伤时的音效,我们希望这些音效能立马触发,那么需要我们预先加载音频,参数为文件路径
void preloadBackgroundMusic(const char *pszFilePath); //预处理音效音频文件
void preloadEffect(const char * pszFilePath);
//卸载预加载到内存中的音效文件。
virtual void unloadEffect ( const char * filePath );