cocos2dx 3.x Win32音量调节无效解决步骤详解

本文详细介绍了如何解决Cocos2d-x中win32环境下使用setBackgroundMusicVolume函数无法准确调整音量大小的问题。通过修改几个关键文件的代码,实现了对音量的精确控制。解释了原理并提供了完整的步骤指导,适合初学者理解和实施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不少博文都已经解决了在win32下setBackgroundMusicVolume函数无法准确的调整音量大小的问题,所以我这篇也不敢妄称原创,

参考链接:http://www.2cto.com/kf/201411/352730.html

但是我这篇尽量要讲最详细的步骤列举清晰,让初学者(包括我)都能清晰解决这个问题,不留坑,并适当说明原理。废话不多说马上进入第一步。

使用版本3.4final,共需修改\cocos2d\cocos\audio\win32\目录下如下截图的三个文件



第一步:setBackgroundMusicVolume这个函数按F12进入,直达文件SimpleAudioEngine.cpp,修改代码如下

float SimpleAudioEngine::getBackgroundMusicVolume()
{
   return sharedMusic().GetVolume() / 1000.0f;
}

void SimpleAudioEngine::setBackgroundMusicVolume(float volume)
{
	 sharedMusic().SetVolume((UINT) (volume * 1000.0));
}

第二步:找到MciPlayer.h文件修改此类并增加两个成员函数声明,加在pubic里的最后面即可

    void SetVolume(UINT volume);
 

    UINT GetVolume() const;

第三步:找到MciPlayer.cpp文件,在文件开始处增加 #include <digitalv.h>(注意别忘了一定要引入额),然后实现SetVolume,GetVolume两个成员函数

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;
}

以上完成后即可重新编译libcocos2d这个工程,因为只改了这几个文件,所以不会引起其他的重新编译,很快


总结原理:

  如果你开发过Window桌面程序,看到他的源码就发现这不就是我们常用mci播放器类,但是值得注意是mci最大音量为1000而setBackgroundMusicVolume的参数是一个0~1的float类型,所以做了转换。耐心的你如果仔细稍微看了一下cocos2dx中的 Mciplayer的源码,你会发现playBackgroundMusic方法其实bLoop参数等于true表示无限循环播放背景音乐的原理就是播放-1次,但是类型是UINT所以就2^32-1=4294967295次,这么多次基本就是无限了,他的原理就是每次播放完都会回调来看次数自减后是否为0,不为0就在重新播放一次。


此时此刻不得不感慨,用windows开发cocos2dx是没有Macbook的苦逼的选择啊









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值