在上一篇中,写了cocos2d-x 2.1.6版本的声音和音效的播放,结果编写如下代码:
float m_MusicVol = 0.5f; // (0.0f~1.0f) 音量大小
float m_WavVol = 0.5f; // (0.0f~1.0f) 音效大小
CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(m_MusicVol);
CocosDenshion::SimpleAudioEngine::sharedEngine()->setEffectsVolume(m_WavVol);
设置无效,查看了下,后来发现在代码中根本就没有对其相关处理,所以参考cocos2d-x中的TestCpp对其进行了修改,大概如下:
(1)打开MciPlayer.h文件,添加头文件:#include <Digitalv.h>,且添加接口,如下:
class MciPlayer
{
public:
/*
设置音量大小 0~1000
*/
void SetVolume(UINT volume);
/*
获取音量大小 0~1000
*/
UINT GetVolume() const;
};
(2)打开MciPlayer.cpp文件,以上接口实现代码如下:
void MciPlayer::SetVolume(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);
}
UINT MciPlayer::GetVolume() 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;
}
(3) 打开SimpleAudioEngine.h,添加如下代码:
class EXPORT_DLL SimpleAudioEngine : public TypeInfo
{
private:
float m_effectsVolume; // 音效音量
};
(4)打开SimpleAudioEngine.cpp,添加如下代码:
SimpleAudioEngine::SimpleAudioEngine():
m_effectsVolume(1.0f) // 音效音量初始化
{
}
unsigned int SimpleAudioEngine::playEffect(const char* pszFilePath, bool bLoop)
{
unsigned int nRet = _Hash(pszFilePath);
preloadEffect(pszFilePath);
EffectList::iterator p = sharedList().find(nRet);
if (p != sharedList().end())
{
p->second->Play((bLoop) ? -1 : 1);
p->second->SetVolume((UINT) (m_effectsVolume * 1000.0f)); // 新代码添加
}
return nRet;
}
// volume interface
float SimpleAudioEngine::getBackgroundMusicVolume()
{
//return 1.0;
return sharedMusic().GetVolume() / 1000.0f;
}
void SimpleAudioEngine::setBackgroundMusicVolume(float volume)
{
sharedMusic().SetVolume((UINT)(volume * 1000.0f));
}
float SimpleAudioEngine::getEffectsVolume()
{
//return 1.0;
return m_effectsVolume;
}
void SimpleAudioEngine::setEffectsVolume(float volume)
{
m_effectsVolume = volume;
EffectList::iterator iter;
for (iter = sharedList().begin(); iter != sharedList().end(); iter++)
{
iter->second->SetVolume((UINT) (volume * 1000.0f));
}
}
接下来编译代码,成功后,便可以控制音量大小了哦。