【Cocos2dx】利用音量螺旋控件控制血量条

其实主要是利用一个小例子来说明两个控件如何使用,一个是CCControlPotentiometer音量螺旋控件,另一个是如何利用CCControlSlider控件整出游戏中常见的血量条。

如图,随着音量螺旋控件的扭动,血量条在变化。

制作过程如下:

一、基本准备

1、首先同样还是利用(cocos2d-x-2.2.6安装目录)\tools\project-creator下的create_project.py用python命令创建一个名为PotentiometerSlider的工程。这里在《【Cocos2dx】Windows平台下Cocos2dx 2.x的下载、安装、配置,打造自己的Helloworld》(点击打开链接)已经说过了,不再赘述。

2、之后,先打开(cocos2d-x-2.2.6安装目录)\samples\Cpp\TestCpp\Resources\Images中,拷贝两张图片到PotentiometerSlider的资源文件夹Resource中,分别是r1.png与r2.png,将作为这个音量螺旋控件的背景。

3、同时,如上图所示,开始->附件->画图,自己手工画3张图片,一张是大小为1x1的,什么都没有的图片1.png,一张是100x100背景为纯黄色的Yellow.png,一张是100x100背景近似黑色的灰色的Black.png,此两张图片直接利用其中的填充工具完成,只要Ctrl+E调好尺寸即可。直接保存到这个工程的资源文件夹中。

Cocos2dx的资源文件夹在《【Cocos2dx】资源文件夹,播放背景音乐,导入外部库》(点击打开链接)已经介绍过了,这里不再赘述。

二、程序编写

1、打开工程\PotentiometerSlider\proj.win32中的HelloCpp.sln,先对Helloworld.h中的回调函数(组件事件的执行方法)的声明进行修改,同时注意引入相应的类与命名空间。

#include "cocos2d.h"
#include "cocos-ext.h"//使用此组件,必须要需要的头文件
USING_NS_CC_EXT;//使用此组件,必须要需要的命名空间  

class HelloWorld : public cocos2d::CCLayer
{
public:
	// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
	virtual bool init();  

	// there's no 'id' in cpp, so we recommend returning the class instance pointer
	static cocos2d::CCScene* scene();

	// a selector callback
	void valueChange(CCObject* pSender,CCControlEvent event);//声明CCControlPotentiometer音量螺旋控件被扭动之时的回调函数

	// implement the "static node()" method manually
	CREATE_FUNC(HelloWorld);
};

2、之后是对HelloWorldScene.cpp修改,其实这部分与《【Cocos2dx】使用CCControlButton创建按钮、按钮点击事件,点击事件中的组件获取,setPosition的坐标问题》(点击打开链接)同样是组件操作的核心问题。这部分主要是两个组件的初始化与CCControlPotentiometer音量螺旋控件被扭动的回调函数。

#include "HelloWorldScene.h"
#include "cocos-ext.h"//使用此组件,必须要需要的头文件

USING_NS_CC;
USING_NS_CC_EXT;//使用此组件,必须要需要的命名空间 

//定义两个宏变量,主要是关于“血条”的最大值与最小值
#define CONTROL_SLIDER_MIN 0
#define CONTROL_SLIDER_MAX 10000

CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();

    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
	//获取屏幕的尺寸、位置信息等
    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();  

	//新建一个音量螺旋控件CCControlPotentiometer
	CCControlPotentiometer *potentiometer=CCControlPotentiometer::create("r1.png","r2.png","CloseSelected.png");//第1个参数是按钮没扭动部分的背景图片、第2个是按钮扭动部分的背景图片、第3个是按钮的主题图片
	potentiometer->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));//此组件居中
	potentiometer->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::valueChange), CCControlEventValueChanged);//第3个参数声明此组件被扭动时的回调函数是第2个参数所指明的函数
	this->addChild(potentiometer);//将此控件添加到场景,默认不自动添加

	//新建一个血条CCControlSlider
	CCControlSlider *controlSlider = CCControlSlider::create("Black.png","Yellow.png","1.png");//第1个参数是血条没有被占据的部分的背景图片,第2是血条被占据的部分的背景图片,第3个参数是条件按钮。
	controlSlider->setPosition(ccp(visibleSize.width/2,visibleSize.height-visibleSize.height/6));//将此组件布置在距离上方还有窗口高度1/6的位置,水平居中
	//设置按钮最大、最小值的基准
	controlSlider->setMinimumValue(CONTROL_SLIDER_MIN);
	controlSlider->setMaximumValue(CONTROL_SLIDER_MAX);
	//------
	controlSlider->setValue(CONTROL_SLIDER_MIN);//设置按钮当前值
	//本来CCControlSlider是供用户调节的,调节按钮是1.png,但是1.png是一张1x1的近乎看不到的图片,同时利用setTouchEnabled(false)将此按钮锁上,禁止用户调节
	controlSlider->setTouchEnabled(false);
	this->addChild(controlSlider,0,1);//将此控件添加到场景,同时设置Tag为1
	return true;
}

void HelloWorld::valueChange(CCObject* pSender,CCControlEvent event){//这个HelloWorld::命名空间不能省,虽然在这个场景当中,但是缺少它,无法通过编译
	CCControlPotentiometer *potentiometer=(CCControlPotentiometer *)pSender;//相当于this的作用,指代为被监听的音量螺旋控件CCControlPotentiometer
	CCControlSlider *controlSlider = (CCControlSlider *)this->getChildByTag(1);//获取血条
	//potentiometer->getValue(),获取音量螺旋控件CCControlPotentiometer的值,此值为一个0-1的数值,为螺旋的部分占据总部分的百分比
	//controlSlider->setValue设置血条的值,尽管controlSlider->setTouchEnabled(false);,但还是可以用代码控制的
	controlSlider->setValue(potentiometer->getValue()*CONTROL_SLIDER_MAX);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 18:25:57

【Cocos2dx】利用音量螺旋控件控制血量条的相关文章

Cocos2d-X中的Slider控件

Slider控件事实上就是滑块控件,经常使用于音乐中的音量控制,在Windows编程中开发音乐播放器就须要用到滑块控件控制音量 首先在project文件夹下的Resource文件夹中放 在Skider.h加入以下的代码 #ifndef __Slider_H__ #define __Slider_H__ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_EXT; class Sli

cocos2dx学习之常用控件的使用

看CSAPP看的头大,做个小游戏娱乐娱乐. 1.一个cocos2dx项目的执行流程 由于cocos2dx和Python是一路货色,搞不到他们的版本更迭这么快并且还非常不兼容,不知道这些设计者是怎么想的,总之是会给大家造成一些个不必要的麻烦.我是用的是cocos2dx3.1的版本,创建好项目之后,在pro.win32里面打开VS的工程.因为任何C++程序,不管是多大的项目,这个程序运行起来和操作系统的接口都是由一个Main函数来完成的. 而且,要注意一点的就是我们要运行一个程序,他里面调用的 自定

Android中用seekbar控件控制歌曲的进度

本人菜鸟一枚,在编写android中用seekbar控件控制歌曲的进度和seekbar随着歌曲的播放自动运动的程序有一些自己的见解,希望各位大牛们多多指点······ 废话先不多说了,先贴一张程序的图吧: 界面不怎么好看,没经过美化,大家将就这看一下吧. 主要思路是运用线程每隔一秒显示一下seekbar控件所在的位置,(这个是使进度条随着歌曲的进度而不断的变化,如果大家想使进度条增加的更连续,可以改变程序循环运行的时间,使其更快) 我只把关于seekbar的程度拿出来了: private int

WPF利用通过父控件属性来获得绑定数据源RelativeSource

WPF利用通过父控件属性来获得绑定数据源RelativeSource 有时候我们不确定作为数据源的对象叫什么名字,但知道作为绑定源与UI布局有相对的关系,如下是一段XAML代码,说明多层布局控件中放置一个文本控件,来显示父级控件的名称. 1.XAML Html代码 <Grid x:Name="g1" Background="Red" Margin="10"> <DockPanel x:Name="d1" Ba

利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出

我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的博客介绍过几篇关于Aspose.Word控件和Aspose.Cell控件的使用操作,如下所示. <使用Aspose.Cell控件实现Excel高难度报表的生成(一)> <使用Aspose.Cell控件实现Excel高难度报表的生成(二)> <使用Aspose.Cell控件实现Ex

自定义Edit控件控制输入范围

1 //自定义Edit,实现十六进制输入控制,使用OnChar()函数实现 2 //MyEdit.h 3 #pragma once 4 5 class CMyEdit : public CEdit { 6 DECLARE_DYNAMIC(CMyEdit) -----------------------① 7 8 public: 9 CMyEdit(){}; 10 protected: 11 DECLARE_MESSAGE_MAP() ----------------------------② 1

利用cxSpreadSheetBook电子表格控件完成复杂性的报表例子

如果报表复杂,可以利用cxSpreadSheetBook电子表格控件来生成报表. 下面例子是装载数据同时设置电子表格格式: procedure TAO_RepShowData.LoadRepData;var  CurCursor: TCursor;begin  CurCursor := Screen.Cursor;                              // 光标设置  Screen.Cursor := crHourGlass;  try    cxSpreadBook.Be

自定义音量调节控件的实现

本篇文章,将介绍如何实现自定义的音量调节控件. 话不多少,先看效果图 本篇文章将介绍两种实现的方式,上面的是通过继承RatingBar,然后设置样式获得的效果,下面的是通过继承自View,完全自定义的方式实现. 我们首先介绍第一种方式,也就是继承自RatingBar实现. public class WmtRatingBar extends RatingBar { private OnRatingBarChanging mOnRatingBarChanging; public WmtRatingB

利用Delphi TStringGrid控件实现日历排程

在ERP实现排程的模块中,我们希望能直观展现个机台每天的排单情况,一直苦恼Delphi没有合适的控件,没办法,先自己动手. 效果图: 绘制日历关键代码 procedure TForm1.DrawCalender; var iDay, iProcess, days: Integer; row,col:Integer; begin //sgCalender. days := DaysInAMonth(StrToInt(cbbYear.Text), StrToInt(cbbMonth.Text));