Cocos2d-x在Windows下音量设置无效的问题

在参照书上例子学习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工程了,因此属性设置可能会不完全,有问题的朋友可以指出,我会适当地做些添加。

你可能感兴趣的:(cocos2d-x,音量)