cocos2dx 3.x VS下运行调节音量无效的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 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.重新编译即可运行,亲测有用!!!

猜你喜欢

转载自blog.csdn.net/iamlegendary/article/details/77369994
今日推荐