在参照书上例子学习Cocos2d-x音量调节的时候,遇到了设置背景音量无效的问题,通过获取背景音量,每次返回值都是1。这是不正常的,因此网上搜索资料,解决了一些问题,但是不完全正确,或者说是瑕疵吧,这里把我调通的经过记录一下,供以后参考。
网上搜索的资料地址为:,这个解决方法不但对背景音量有效,而且对特效音量也是适用的。本文有一些内容是和上述资料有所重合的。
另外,我所用的Cocos2d-x版本是cocos2d-2.1beta3-x-2.1.1,编译环境是VS2010。
一、修改源代码(参考网上资料)
1、首先更改Cocos2d-x目录下CocosDenshion/win32/Mciplayer.h,如下(红色为新添加内容):
/**
*/
UINT GetSoundID();
// volume value ranges from 0 .. 1000
void Volume(UINT volume);
// return value ranges from 0 .. 1000
UINT Volume() const;
private:
friendLRESULT WINAPI _SoundPlayProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAMlParam);
2、然后更改Cocos2d-x目录下CocosDenshion/win32/Mciplayer.cpp,如下(红色为新添加内容):
void MciPlayer::Open(constchar* pFileName, UINT uId)
{
// WCHAR * pBuf = NULL;
do
{
BREAK_IF(! pFileName || ! m_hWnd);
m_bPlaying = false;
} while(0);
}
voidMciPlayer::Volume(UINT volume)
{
if (!m_hDev)
return;
MCI_DGV_SETAUDIO_PARMS mciParams = {0};
mciParams.dwItem = MCI_DGV_SETAUDIO_VOLUME;
mciParams.dwValue = volume;
mciSendCommand(m_hDev, MCI_SETAUDIO,MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)&mciParams);
}
UINTMciPlayer::Volume() const
{
if (!m_hDev)
return 0;
MCI_STATUS_PARMS mciParams = {0};
mciParams.dwItem = MCI_DGV_STATUS_VOLUME;
mciSendCommand(m_hDev, MCI_STATUS,MCI_STATUS_ITEM, (DWORD)&mciParams);
return mciParams.dwReturn;
}
void MciPlayer::Play(UINT uTimes /*= 1 */)
{
if (!m_hDev)
{
return;
}
…代码省略…
}
3、最后更改Cocos2d-x目录下CocosDenshion/win32/ SimpleAudioEngine.cpp,如下(浅蓝色为去掉内容,红色为添加内容):
(1)修改getBackgroundMusicVolume
floatSimpleAudioEngine::getBackgroundMusicVolume()
{
//return 1.0;
return sharedMusic().Volume() / 1000.0f;
}
(2)修改setBackgroundMusicVolume
voidSimpleAudioEngine::setBackgroundMusicVolume(floatvolume)
{
sharedMusic().Volume((UINT) (volume * 1000.0));
}
(3)修改getEffectsVolume
floatSimpleAudioEngine::getEffectsVolume()
{
//return 1.0;
return sharedList().begin()->second->Volume() /1000.0f; // XXX returning the first
}
此处需要注意:网络上代码“sharedList().at(0)->Volume()/ 1000.0f;”在VS2010中是有编译错误的,此处map的使用有误。
(4)修改setEffectsVolume
voidSimpleAudioEngine::setEffectsVolume(floatvolume)
{
EffectList::iteratoriter;
for(iter = sharedList().begin(); iter != sharedList().end(); ++iter)
{
iter->second->Volume((UINT)(volume * 1000.0));
}
}
二、重新编译CocosDenshion
而做人的能力则会给你一百种机会。