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

本文解决Cocos2d-x 3.11.1在VS环境下音乐和音效无法正确关闭的问题。通过修改源码,实现音乐和音效音量的设置与获取。

最近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.重新编译即可运行,亲测有用!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值