【Cocos2d-x】控制音量的滚动条

原创 2015年07月10日 21:09:49

上一篇好不容易把滚动条加进来了,结果发现拿它控制音量也不是那么轻松的。

要面对的是两个问题:

1、如何控制音量

2、如何让音量值随滚动条的变化而变

对问题1 本来没想到会是个问题,结果还是出了问题,而且找了半天才找到问题。之前一直用SimpleAutioEngine,别的功能都好用,就是控制音量的函数,进到里面发现是空函数。(真不负责任)这也就解释了为啥 cpp_tests 里的CocosDenshion下面的滚动条控制不了音量。这时发现下面还有一个NewAutioEngine,既然是新的,应该还是趋势,就改用这个吧。这个AutioEngine不需要预加载,所有场景通用,不区分音乐和音效,主要就是这些区别。

怎么用呢,首先还是应该先"添加外部依赖项",这个照上一篇做就可以。然后在需要的类里引用 #include "audio/include/AudioEngine.h"  并在下面添加命名空间 using namespace experimental; 这样就可以使用 AutioEngine 类了。控制音量的就是 AutioEngine::setVolume() 方法

问题2本来也没以为有多复杂,结果通过它着实的巩固了一下C++. 大致原理是这样,我们从extension里引用过来的ControlSlider只是个滚动条,Cocos帮我们做的是我们把它添加到场景之后,可以进行拖拽。但我们想要在它值变动的时候改变不同声音的大小。其实就是要在 onTouchMoved 的时候做些其他事情,并且这个不在滚动条里做,要在外面做。

解决办法就是,做一个类继承 ControlSlider ,在这个新类里重写 onTouchMoved 函数,让它除了做基类的改变值之外再执行一个回调函数。这样当我们在使用这个类的时候,把要执行的回调函数赋给它就可以了。

干说还是太抽象,还是直接上代码:

#pragma once
#include "Cocos2d.h"
#include "extensions/GUI/CCControlExtension/CCControlSlider.h"

using namespace cocos2d;

class ControlAudioSlider :public extension::ControlSlider
{
public:
	ControlAudioSlider();
	~ControlAudioSlider();

	typedef std::function<void(ControlAudioSlider*, float, Event*)> audioSliderCallback;
	static ControlAudioSlider* create(const char* bgFile, const char* progressFile, const char* thumbFile);

	virtual bool onTouchBegion(Touch* touch, Event* pEvent);
	virtual void onTouchMoved(Touch* touch, Event* pEvent);
	
	void setValues(float minValue, float maxValue, float value);
	void setCallBack(const audioSliderCallback& callback);
private:
	audioSliderCallback	_callback;
	float _ratio;
};

#include "ControlAudioSlider.h"
#include "SimpleAudioEngine.h"

using namespace CocosDenshion;

ControlAudioSlider::ControlAudioSlider()
{
}


ControlAudioSlider::~ControlAudioSlider()
{
}

ControlAudioSlider* ControlAudioSlider::create(const char* bgFile, const char* progressFile, const char* thumbFile)
{	
	Sprite *backgroundSprite = Sprite::create(bgFile);
	Sprite *progressSprite = Sprite::create(progressFile);
	Sprite *thumbSprite = Sprite::create(thumbFile);

	ControlAudioSlider* pRet = new (std::nothrow) ControlAudioSlider();
	pRet->initWithSprites(backgroundSprite, progressSprite, thumbSprite);

	return pRet;
}

bool ControlAudioSlider::onTouchBegion(Touch* touch, Event* pEvent)
{	
    bool b = extension::ControlSlider::onTouchBegan(touch, pEvent);	
	return b;
}

void ControlAudioSlider::onTouchMoved(Touch* touch, Event* pEvent)
{
	extension::ControlSlider::onTouchMoved(touch, pEvent);
	_ratio = getValue() / getMaximumValue();
	if (_callback)
	{
		_callback(this, _ratio, pEvent);
	}
}

void ControlAudioSlider::setCallBack(const audioSliderCallback& callback)
{
	_callback = callback;
}

void ControlAudioSlider::setValues(float minValue, float maxValue, float value)
{
	this->setMinimumValue(minValue);
	this->setMaximumValue(maxValue);
	this->setValue(value);
}
	ControlAudioSlider* slider = ControlAudioSlider::create("back/sliderTrack.png", "back/sliderProgress.png", "back/sliderThumb.png");
	slider->setPosition(Vec2(size.width / 2, size.height / 2));
	slider->setValues(0, 1.0f, 0.8f);
	slider->setCallBack([&](ControlAudioSlider* sender, float ratio, Event* pEvent)
	{
		AudioEngine::setVolume(musicID, ratio);
		ConstClass::musicVolum = ratio;
	});

	this->addChild(slider, 5);



cocos2d-x 3.x学习之滑动条控制背景音乐音量

#include #include "cocos2d.h" #include "StartScene.hpp" #include "ui/CocosGUI.h" #include "SimpleAu...
  • wandersm
  • wandersm
  • 2016年10月17日 19:51
  • 1208

C# 控制音量 (滚动条形式)

 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using S...
  • cstester
  • cstester
  • 2009年11月02日 16:17
  • 1214

Cocos2d-x教程(31)-TableView的滚动条

Cocos2d-x CCTableView 滚动条的实现
  • u012945598
  • u012945598
  • 2014年08月15日 16:54
  • 3895

【Cocos2d】3.0版本在Windows平台下的音量调节修改问题

在游戏的设置中会遇到设置音乐和音效的设置,包括音量设置。 但是在3.0的版本中,在Windows平台下发现音量设置是无法设置的。查看源代码发现,,这部分的居然没实现。。。。一个是始终返回1.0 的函...
  • hu1020935219
  • hu1020935219
  • 2015年04月07日 09:34
  • 1415

Cocos2d-x 声音和音效

使用音效引擎我们可以使用Cocos2d-x自带的CocosDension库来使用声音引擎。CocosDesion实现了简单易用的SimpleAudioEngine类,为了使用它,我们只需引入他的头文件...
  • sinat_24229853
  • sinat_24229853
  • 2016年07月14日 13:31
  • 284

vb 控制系统音量

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVa...
  • boys1999
  • boys1999
  • 2014年10月11日 12:24
  • 973

cocos2dx 3.x Win32音量调节无效解决步骤详解

不少博文都已经解决了在win32下setBackgroundMusicVolume函数无法准确的调整音量大小的问题,所以我这篇也不敢妄称原创, 参考链接:http://www.2cto.com/kf/...
  • lightspear
  • lightspear
  • 2015年04月24日 21:28
  • 1846

用javascript进行声音播放控制

用javascript进行声音播放控制function MM_controlSound(sndAction,sndObj){    if(eval(sndObj) != null)  {       ...
  • colourbear
  • colourbear
  • 2006年05月19日 23:54
  • 6638

Java 控制音量

import javax.sound.sampled.*; AudioInputStream audioInputStream = AudioSystem.getAudioInputStream( ...
  • suochao90
  • suochao90
  • 2014年05月11日 00:38
  • 3018

as3音量控制

as3中,音量的控制改变的是当前声音通道的音量大小。要实现此效果,需要创建一个SoundTransform对象,然后使用该对象的volume属性来改变SoundTransform对象的音量值,并最后应...
  • yinyiniao
  • yinyiniao
  • 2009年12月12日 15:50
  • 4880
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Cocos2d-x】控制音量的滚动条
举报原因:
原因补充:

(最多只允许输入30个字)