用滑动块来控制音量以及声音开关:
加入头文件以及命名空间
.h文件
#include"GUI\CCControlExtension\CCControl.h"
#include"GUI\CCControlExtension\CCControlSwitch.h"
using namespace cocos2d::extension;
定义音量大小值:
float soundValue;
定义声音开关控制函数
void soundSwitch(Ref* psender, Control::EventType controlevent);
cpp文件
#include "ui/CocosGUI.h"
#include"GUI/CCControlExtension/CCInvocation.h"//当我按照其他人的方法就会出现cccontrol_selector报错,然后我发现cccontrol_selector定义是在Invocation文件中
using namespace ui;
using namespace CocosDenshion;
auto yinliang = Slider::create();
yinliang->loadBarTexture("yinliangn.png");//音量进度条背景
yinliang->loadSlidBallTextures("yinliangb.png", "yinliangb.png", "");//滑动块
yinliang->loadProgressBarTexture("yinliangy.png");//进度条
//yinliang->setPercent(soundValue * 100);
yinliang->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
yinliang->addEventListener([=](Ref* pSender, Slider::EventType type) {
if (type == Slider::EventType::ON_PERCENTAGE_CHANGED) {
soundValue = yinliang->getPercent()*0.01;
log("NOW=%.2f", soundValue);
// 设置背景音乐值
SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(soundValue);
// 设置音效值
SimpleAudioEngine::getInstance()->setEffectsVolume(soundValue);
UserDefault::getInstance()->setFloatForKey("soundNum", soundValue);
UserDefault::getInstance()->flush();
}
});
this->addChild(yinliang);
//声音开关
auto soundControl = ControlSwitch::create
(
Sprite::create("switch-mask.png"),//开关按钮背景
Sprite::create("switch-on.png"),//开
Sprite::create("switch-off.png"),//关
Sprite::create("switch-thumb.png"),//滑动块
Label::createWithSystemFont("On", "Arial-BoldMT", 16),//显示的汉字
Label::createWithSystemFont("Off", "Arial-BoldMT", 16)
);
soundControl->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::soundSwitch), Control::EventType::VALUE_CHANGED);
soundControl->setPosition(Vec2(visibleSize.width/2,visibleSize.height*0.3));
this->addChild(soundControl);
}
void HelloWorld::soundSwitch(Ref* psender, Control::EventType controlevent) {
auto fSwitch = (ControlSwitch*)psender;
if (fSwitch->isOn()) {
SimpleAudioEngine::getInstance()->resumeAllEffects();
SimpleAudioEngine::getInstance()->rewindBackgroundMusic();
}
else {
SimpleAudioEngine::getInstance()->stopAllEffects();
SimpleAudioEngine::getInstance()->stopBackgroundMusic();
}
}
因为cocos2d关于声音没有定义音量控制,所以还需在MciPlayer修改
h文件
//设置音量
void SetVolume(UINT volume);
//取得音量
UINT GetVolume()const;
cpp文件
#include <digitalv.h>//加入的
//设置音效
void MciPlayer::SetVolume(UINT volume)
{
if (!_dev)
{
return;
}
MCI_DGV_SETAUDIO_PARMS mciParams = { 0 };
mciParams.dwItem = MCI_DGV_SETAUDIO_VOLUME;
mciParams.dwValue = volume;
mciSendCommand(_dev, MCI_SETAUDIO, MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)&mciParams);
}
UINT MciPlayer::GetVolume() const
{
if (!_dev)
return 0;
MCI_STATUS_PARMS mciParams = { 0 };
mciParams.dwItem = MCI_DGV_STATUS_VOLUME;
mciSendCommand(_dev, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&mciParams);
return mciParams.dwReturn;
}
注意上面两个函数应该加在}内,本人第一次没仔细看,导致报错
现在就是完善cocos声音控制,SimpleAudioEngine.cpp文件中从261行开始
float SimpleAudioEngine::getBackgroundMusicVolume()
{
return sharedMusic().GetVolume() / 1000.0f;
// return 1.0;
}
void SimpleAudioEngine::setBackgroundMusicVolume(float volume)
{
sharedMusic().SetVolume((UINT)(volume * 1000.0));
}
float SimpleAudioEngine::getEffectsVolume()
{
return sharedList().begin()->second->GetVolume() / 1000.0f;
// return 1.0;
}
void SimpleAudioEngine::setEffectsVolume(float volume)
{
EffectList::iterator iter;
for (iter = sharedList().begin(); iter != sharedList().end(); iter++) {
iter->second->SetVolume((UINT)(volume*1000.0f));
}
}
可能最后Control相关还会报错
就点击项目右键打开属性,在c/c++选择附加包含目录加入:$(EngineRoot)cocos\editor-support;$(EngineRoot)cocos;$(EngineRoot);(可能有些不需要,但是本人也是新手所以就全加了)
现在关于进度条和开关控制声音基本完成