版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iamlegendary/article/details/77369994
最近VS下跑自己的游戏,发现音乐的开关一直有问题,就是无论设置音量是1还是0,音乐和音效一直可以播放。我用的版本是cocos2dx 3.11.1,首先以为是自己的业务逻辑有问题,然后去仔细检查,发现没问题。
而且VS下也没报任何错误。关键是打出来的Android和IOS包都没问题,内心OS:到底TM发生了什么?
然后就很容易想到了可能针对win32的处理不一样吧,就找到了项目路径下的frameworks\cocos2d-x\cocos\audio\win32路径,打开此路径下的SimpleAudioEngine.cpp,发现了疑点!!!
float SimpleAudioEngine::getBackgroundMusicVolume()
{
return 1.0;
}
void SimpleAudioEngine::setBackgroundMusicVolume(float volume)
{
}
float SimpleAudioEngine::getEffectsVolume()
{
return 1.0;
}
void SimpleAudioEngine::setEffectsVolume(float volume)
{
}
里面设置音乐和音效的函数是空的,而获取的函数是返回固定的1.0 !!!
这个是写引擎的人懒得对win32进行处理么?虽然一般来说,不打win32的包,可我们需要调试啊!
好了,平息一下我们的愤怒,体谅一下,毕竟这是免费的开源引擎!还是自己动手吧,
不说废话了,直接上修改方法:
打开工程下这个路径:frameworks\cocos2d-x\cocos\audio\win32
注:红色部分就是需要修改的
1.打开MciPlayer.h,在public属性下添加
void SetVolume(UINT volume);
UINT GetVolume() const;
如图:
2.打开MciPlayer.cpp,在文件开头添加
#include <digitalv.h>
如图:
文件中部(位置随便,跟在某个public方法后面就行)添加两个方法:
void MciPlayer::SetVolume(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::GetVolume() 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;
}
3.打开之前有疑点的SimpleAudioEngine.cpp,进行最后一步,修改文章开头那四个让人懵逼的方法!
float SimpleAudioEngine::getBackgroundMusicVolume()
{
return sharedMusic().GetVolume() / 1000.0f;
}
void SimpleAudioEngine::setBackgroundMusicVolume(float volume)
{
sharedMusic().SetVolume((UINT) (volume * 1000.0));
}
float SimpleAudioEngine::getEffectsVolume()
{
//return 1.0;
return sharedList().begin()->second->GetVolume()/1000.0f; // XXX returning the first
}
void SimpleAudioEngine::setEffectsVolume(float volume)
{
for (auto iter = sharedList().begin(); iter != sharedList().end(); ++iter)
{
iter->second->SetVolume((UINT)(volume * 1000.0));
}
}
将原来这个方法替换成这样的即可。
4.重新编译即可运行,亲测有用!!!