• cocos2d-x 2.2.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));  
        }
    }

    接下来编译代码,成功后,便可以控制音量大小了哦。

  • 相关阅读:
    《学习之道》第六章习惯的部分-信号
    《学习之道》第六章习惯的组成
    《学习之道》第六章习惯的形成
    《学习之道》第五章小恶魔造成拖延(二)
    《学习之道》第五章拖延的两个小案例
    《学习之道》第五章是借口造成拖延(一)
    《学习之道》第五章认识拖延
    《学习之道》第五章认识“小恶魔”
    《学习之道》第五章分心与拖延
    redis 安装
  • 原文地址:https://www.cnblogs.com/SkyflyBird/p/5089991.html
Copyright © 2020-2023  润新知