cocos2d-X 3.10关于声音开关以及音量大小问题

用滑动块来控制音量以及声音开关:

加入头文件以及命名空间

.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);(可能有些不需要,但是本人也是新手所以就全加了)

现在关于进度条和开关控制声音基本完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硪就是硪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值