你的游戏肯定会需要音乐和音效!Cocos2d-x 提供了一个 SimpleAudioEngine 类支持游戏内的音乐和音效。它可以被用来增加背景音乐,控制游戏音效。
SimpleAudioEngine 是一个共享的单例对象,你可以在代码中的任何地方通过很简单的方式获取到。
先来了解一下支持的文件格式。
补充:若此部分出现报错,尝试在代码头部增加

  1. 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

播放背景音乐

通过下面的方式,播放一个音频文件作为背景音乐,可以控制背景音乐是否循环播放。
注意,同一时间只能出现一个背景音乐

  1. #include "SimpleAudioEngine.h" //注意头文件
  2. using namespace CocosDenshion; //注意命名空间
  3. auto audio = SimpleAudioEngine::getInstance();
  4. // 设置背景音乐并且连续循环
  5. audio->playBackgroundMusic("mymusic.mp3", true);
  6. // 设置背景音乐但只播放一次
  7. 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平台适配修改音量大小的函数内容
操作步骤:

  1. 修改**项目路径\cocos2d\cocos\audio\win32\**目录下的MciPlayer.h文件
  2. 打开MciPlayer.h文件,添加头文件**#include <Digitalv.h>**
  3. 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;
     }
    
  4. 在我们代码中的->playBackgroundMusic() 函数上右键,选择转到定义

image.png

  1. 这时,我们会发现,这个函数体中是空的,官方并没有写出这里的代码,所以我们加上

    void SimpleAudioEngine::setBackgroundMusicVolume(float volume)
    {
     sharedMusic().Volume((UINT)(volume * 1000.0)); //增加这一句代码
    }
    
  2. 其余的函数也可以响应的补充代码 ```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 );