## 15.1 播放2D音效 2D音效一般用在UI系统中,比较直观的感受就是左右耳听到的音量大小一致。 下面用 解析并播放下面3个wav音效: 背景音乐,循环播放。 刀攻击音效。 法术技能音效。 来熟悉FMOD的使用,分3步走: 创建类 对上面3个操作进行封装,结构如下: 1.初始化FMOD 在申请使用硬件资源时,都需要初始化,渲染之前需要初始化OpenGL,现在播放音效之前需要初始化FMOD。 在应用程序初始化的时候调用 。 在刷帧的时候调用 。 每一帧调用 ,主要是更新3d音频位置、执行回调等作用。 2.加载音效文件 初始化 Fmod之后,就可以加载wav音效文件,创建 实例。 在 example的 中进行创建。
CLion项目文件位于 samples\audio\fmod_play_2d_audio
2D音效一般用在UI系统中,比较直观的感受就是左右耳听到的音量大小一致。
下面用fmod解析并播放下面3个wav音效:
来熟悉FMOD的使用,分3步走:

创建类 Audio 对上面3个操作进行封装,结构如下:
///file:source/audio/audio.cpp line:10 void Audio::Init(){ FMOD_RESULT result; // 创建FMOD System实例 result=FMOD_System_Create(&fmod_system_); spdlog::info("FMOD::System_Create ret code {}",result); //获取版本号 unsigned int version; result = FMOD_System_GetVersion(fmod_system_,&version); spdlog::info("FMOD_System_GetVersion ret code {}",result); if (version < FMOD_VERSION){ spdlog::critical("FMOD lib version {} doesn't match header version {}", version, FMOD_VERSION); return; } //初始化 系统 result=FMOD_System_Init(fmod_system_,32,FMOD_INIT_NORMAL,0); spdlog::info("FMOD_System_Init ret code {}",result); } FMOD_RESULT Audio::Update() { return FMOD_System_Update(fmod_system_); } FMOD_RESULT Audio::CreateSound(const char *name_or_data,FMOD_MODE mode,FMOD_CREATESOUNDEXINFO *ex_info,FMOD_SOUND **sound) { return FMOD_System_CreateSound(fmod_system_,name_or_data,mode,ex_info,sound); } FMOD_RESULT Audio::PlaySound(FMOD_SOUND *sound,FMOD_CHANNELGROUP *channel_group,bool paused,FMOD_CHANNEL **channel) { return FMOD_System_PlaySound(fmod_system_,sound,channel_group,paused,channel); }
在申请使用硬件资源时,都需要初始化,渲染之前需要初始化OpenGL,现在播放音效之前需要初始化FMOD。
在应用程序初始化的时候调用Audio::Init()。
///file:source/utils/application.cpp line:113 void Application::Init() { ...... //初始化 fmod Audio::Init(); }
在刷帧的时候调用Audio::Update()。
///file:source/utils/application.cpp line:129 void Application::Update(){ ...... Audio::Update(); }
Update每一帧调用FMOD_System_Update,主要是更新3d音频位置、执行回调等作用。
初始化 Fmod之后,就可以加载wav音效文件,创建FMOD_SOUND实例。
在 example的 LoginScene.Awake()中进行创建。
///file:example/login_scene.cpp line:49 void LoginScene::Awake() { ...... CreateSounds(); } void LoginScene::CreateSounds() { FMOD_RESULT result; // 战斗背景音乐 result = Audio::CreateSound((Application::data_path() + "audio/war_bgm.wav").c_str(), FMOD_2D | FMOD_LOOP_NORMAL,nullptr, &sound_1); // 刀攻击音效 result = Audio::CreateSound((Application::data_path() + "audio/knife_attack.wav").c_str(), FMOD_2D, nullptr, &sound_2); // 魔法攻击音效 result = Audio::CreateSound((Application::data_path() + "audio/magic_attack.wav").c_str(), FMOD_2D, nullptr, &sound_3); }
Audio::CreateSound传入的参数 FMOD_MODE用的比较多的有以下几个:
FMOD_DEFAULT:默认配置 FMOD_LOOP_OFF:关闭循环 FMOD_LOOP_NORMAL:循环 FMOD_2D:设置为2D音效 FMOD_3D:设置为3D音效
如果加载成功,返回 result == FMOD_OK 并且设置 sound_1,否则返回错误码。
通过按键 1、2、3来控制3个音效的播放/暂停。
///file:example/login_scene.cpp line:145 void LoginScene::Update() { ...... //按 1 2 3 播放/暂停 3个音效 if(Input::GetKeyUp(KEY_CODE_1)){ PlayPauseSound(sound_1,&channel_1); }else if(Input::GetKeyUp(KEY_CODE_2)){ PlayPauseSound(sound_2,&channel_2); }else if(Input::GetKeyUp(KEY_CODE_3)){ PlayPauseSound(sound_3,&channel_3); } } void LoginScene::PlayPauseSound(FMOD_SOUND *sound, FMOD_CHANNEL** channel) { FMOD_RESULT result; FMOD_BOOL paused=false; //判断音效是否暂停 result = FMOD_Channel_GetPaused(*channel, &paused);//音效播放完毕后,channel被回收,返回 FMOD_ERR_INVALID_HANDLE switch(result){ case FMOD_OK: //暂停播放 result= FMOD_Channel_SetPaused(*channel, !paused); break; case FMOD_ERR_INVALID_PARAM://channel默认是nullptr,非法参数。 case FMOD_ERR_INVALID_HANDLE://音效播放完毕后,channel被回收。 case FMOD_ERR_CHANNEL_STOLEN://音效播放完毕后,channel被回收且被分配给其他Sound。 //播放音效 result = Audio::PlaySound(sound, nullptr, false, channel); break; } }
运行项目,测试播放音效。