在参照书上例子学习Cocos2d-x音量调节的时候,遇到了设置背景音量无效的问题,通过获取背景音量,每次返回值都是1。这是不正常的,因此网上搜索资料,解决了一些问题,但是不完全正确,或者说是瑕疵吧,这里把我调通的经过记录一下,供以后参考。
网上搜索的资料地址为:http://blog.csdn.net/u012855000/article/details/20841943,这个解决方法不但对背景音量有效,而且对特效音量也是适用的。本文有一些内容是和上述资料有所重合的。
另外,我所用的Cocos2d-x版本是cocos2d-2.1beta3-x-2.1.1,编译环境是VS2010。
一、修改源代码(参考网上资料)
1、首先更改Cocos2d-x目录下CocosDenshion/win32/Mciplayer.h,如下(红色为新添加内容):
/**
@brief 获取当前播放的音效 ID
@return 当前播放的音效ID
*/
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(const char* 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
修改好了上面的代码,就可以重新编译CocosDenshion工程了,编译之后对应的dll和lib文件分别是:libCocosDenshion.dll、libExtensions.lib。注意,仅仅修改源文件代码是不能使其生效的,因为Cocos2d-x游戏开发是直接使用的编译好的库进行连接的,因此需要获得修改代码之后的库文件。
打开CocosDenshion/proj.win32中的工程文件CocosDenshion.vcxproj,修改工程属性:
(1)属性-配置属性-常规-输出目录:..\..\Debug.win32\
(2)属性-配置属性-链接器-输出文件:..\..\Release.win32\$(ProjectName).dll
(3)属性-配置属性-链接器-附加库目录:$(OutDir);..\..\Release.win32\
至此,工程属性(我这里是Debug属性,Release属性类似)应该是配置好了,编成功编译之后就可以在Debug.win32目录下获取相应的lib、dll文件了,再次编译音量调节程序,就可以实现音量的变化了。
最后,由于我已经可以正常编译CocosDenshion工程了,因此属性设置可能会不完全,有问题的朋友可以指出,我会适当地做些添加。