Cocos2D-X2.2.3学习笔记6(UI系统)
来源:互联网 发布:手机桌面计时器软件 编辑:程序博客网 时间:2024/05/21 20:48
上一节我们介绍了其中两种字体和计时器的使用,以及字体的一些常用方法,比如获取指定下标的单个字体(getChildByTag),改变字体内容(setString)
接下来我们介绍最后一种字体,以及进度条的简单使用
bool HelloWorld::init(){if ( !CCLayer::init() ){return false;}CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();CCLabelAtlas* atlas= CCLabelAtlas::create("HelloWorld","fonts/tuffy_bold_italic-charmap.png",64,48,32);atlas->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));this->addChild(atlas);return true;}
运行结果
为嘛这样呢?
我们来说一下这五个参数
第一个为要显示的字符串
第二个为图片的名称
第三个每个字符的宽度
第四个为每个字符的高度
第五个为这张图片中第一个字符的编码
之所以我不知道第一个字符的编码是什么,随便填了个32(32对应哪个字母我也不知道,呵呵),所以会出现如下情况
当然 create还有一个重载方法,只有两个参数,第一个还是需要显示的字符串,第二个为plis文件,但是你用记事本打开该文件.
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>version</key><integer>1</integer><key>textureFilename</key><string>tuffy_bold_italic-charmap.png</string><key>itemHeight</key><integer>64</integer><key>itemWidth</key><integer>48</integer><key>firstChar</key><integer>32</integer></dict></plist>它维护的其实还是一样的东西。
这里我们不深究,总之我还是喜欢BMFont一点
接下来我们来看看进度条
bool HelloWorld::init(){if ( !CCLayer::init() ){return false;}//创建一个精灵显示,这将作为进度条的底层CCSprite* progressbgSprite=CCSprite::create("time_slot-hd.png");progressbgSprite->setPosition(ccp(240,160));this->addChild(progressbgSprite);//创建一个进度条CCProgressTimer* progress1=CCProgressTimer::create(CCSprite::create("time_bars-hd.png"));//设置进度条的类型为条形progress1->setType(kCCProgressTimerTypeBar);progress1->setMidpoint(ccp(0,1)); progress1->setBarChangeRate(ccp(1, 0));//设置进度条当前的值progress1->setPercentage(0); progress1->setPosition(ccp(240,160));this->addChild(progress1);//创建一个进度条动画progress1->runAction(CCRepeatForever::create(CCProgressTo::create(2,100)));return true;}这段代码很简单,
第一步创建一个精灵作为进度条的底层,
第二步,创建一个进度条,类为CCProgressTimer
三,设置进度条的类型setType,F12跟进去参数是CCProgressTimerType类型的,在继续F12,意思很明显。他是个枚举,其中有两个类型,条形和扇形
typedef enum { /// Radial Counter-Clockwise kCCProgressTimerTypeRadial, /// Bar kCCProgressTimerTypeBar,} CCProgressTimerType;这里我们先设置为Bar,条形
四,设置Midpoint,这里我们看源码
/** * Midpoint is used to modify the progress start position. * If you're using radials type then the midpoint changes the center point * If you're using bar type the the midpoint changes the bar growth * it expands from the center but clamps to the sprites edge so: * you want a left to right then set the midpoint all the way to ccp(0,y) * you want a right to left then set the midpoint all the way to ccp(1,y) * you want a bottom to top then set the midpoint all the way to ccp(x,0) * you want a top to bottom then set the midpoint all the way to ccp(x,1) */ CC_PROPERTY(CCPoint, m_tMidpoint, Midpoint);还记得我们讲解内存管理的时候用到的一些常用的宏吧??它会自动给出GET/SET方法
这里也是一样,我现在也不知道SetMidpoint是干什么用的,现在我们来翻译一下它的注释
1.Midpoint 是用来修改进度条的开始位置
2.如果你使用的类型是扇形,那么它将变为中心点
3.如果是条形,它将改变条形的成长
4.它扩展了中心点和精灵的边缘
5.如果从左到右,设置为ccp(0,y)
6.如果从右到左,设置为ccp(1,y)
7.如果从下到上,设置为ccp(x,0)
8.如果从上到下,设置为ccp(x,1)
英文不太好,翻译出来能理解个大概意思就可以了,这里我们设置为CCP(0,1).从左到右 OK
五,我们设置了setBarChangeRate
这里我也不知道是什么东西,看源码
/** * This allows the bar type to move the component at a specific rate * Set the component to 0 to make sure it stays at 100%. * For example you want a left to right bar but not have the height stay 100% * Set the rate to be ccp(0,1); and set the midpoint to = ccp(0,.5f); */ CC_SYNTHESIZE(CCPoint, m_tBarChangeRate, BarChangeRate);翻译
这里真心不会翻译
但是根据我多次测试,总结出来,
第一个参数控制横向,第二个参数控制竖向,你可以把这句代码删除,运行,默认是从左上角到右下角延生,
但是我只想长度延生,OK ccp(1,0)
高度延生 ccp(0,1)
一起延生 ccp(1,1)
都不延生 ccp(0,0)
自己多试试就明白了,这里还可以设置0.5f
六,设置进度条的当前值
设置位置,
添加到节点
创建一个持续执行的动画 CCRepeatForever
创建进度条动画CCProgeressTo 2秒将进度执行到100
明白了之后我们在修改修改我们的代码
#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"#include "SimpleAudioEngine.h"using namespace CocosDenshion;typedef enum{eprogressbgSprite=1,eprogress1=2,ettf=3};class HelloWorld : public cocos2d::CCLayer{public: virtual bool init(); virtual void update(float delta); static cocos2d::CCScene* scene(); CREATE_FUNC(HelloWorld);};#endif // __HELLOWORLD_SCENE_H__
#include "HelloWorldScene.h"USING_NS_CC;CCScene* HelloWorld::scene(){// 'scene' is an autorelease objectCCScene *scene = CCScene::create();// 'layer' is an autorelease objectHelloWorld *layer = HelloWorld::create();// add layer as a child to scenescene->addChild(layer);// return the scenereturn scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){if ( !CCLayer::init() ){return false;}//创建一个精灵显示,这将作为进度条的底层CCSprite* progressbgSprite=CCSprite::create("time_slot-hd.png");progressbgSprite->setPosition(ccp(240,160));this->addChild(progressbgSprite,1,eprogressbgSprite);//创建一个进度条CCProgressTimer* progress1=CCProgressTimer::create(CCSprite::create("time_bars-hd.png"));//设置进度条的类型为条形progress1->setType(kCCProgressTimerTypeBar);progress1->setMidpoint(ccp(0,1)); progress1->setBarChangeRate(ccp(1, 0));//设置进度条当前的值progress1->setPercentage(0); progress1->setPosition(ccp(240,160));this->addChild(progress1,1,eprogress1);//创建一个字体,显示到进度条中间CCLabelTTF *ttf=CCLabelTTF::create("0","fonts/arial.ttf",12);ttf->setPosition(ccp(240,160));this->addChild(ttf,1,ettf);//添加计时器this->scheduleUpdate();//创建一个进度条动画//progress1->runAction(CCRepeatForever::create(CCProgressTo::create(2,100)));return true;}void HelloWorld::update(float delta){//获得进度条和字体标签 CCProgressTimer* progress1=(CCProgressTimer*)this->getChildByTag(eprogress1); CCLabelTTF* ttf=(CCLabelTTF*)this->getChildByTag(ettf); //获得当前进度 float cu= progress1->getPercentage(); cu+=0.1f; progress1->setPercentage(cu); //改变字体 CCString *custr= CCString::createWithFormat("%2.0f%%",cu); ttf->setString(custr->getCString());}
运行
这里和上一个实例比较起来无非就是加了一个进度值
我们看看代码,
我们把运行进度条动画的代码注释了,
创建了一个字体加入到了进度条的中心位置
然后添加了一个计时器
这个计时器和我们上一节讲的不一样了,对吧。。多了个update,没错,这是继承CCNode类下面的
我们看运行窗口做下角,是不是有个60??这个计时器就是一秒钟执行60次,应该是这个意思吧??我也不确定。这里换成我们上一节介绍的计时器也可以
这个计时器调用的是update函数,从CCNode继承下来的,
我们看看函数的实现
通过getChildByTag获得一些我们需要的精灵
getPercentage获得当前进度值
setPercentage设置进度值
CCString这个类是Cocos2d-x里面的字符串类,这两句代码简单的使用了这个类
理解了吧??
我们接下来在来看看扇形进度条
//背景精灵CCSprite *sprite= CCSprite::create("Icon.png");sprite->setOpacity(80);sprite->setPosition(ccp(240,10));sprite->setAnchorPoint(ccp(0.5,0));this->addChild(sprite,1);//进度条CCProgressTimer* spriteProgress=CCProgressTimer::create(CCSprite::create("Icon.png"));//设置透明度spriteProgress->setPosition(ccp(240,10));spriteProgress->setAnchorPoint(ccp(0.5,0));spriteProgress->setType(kCCProgressTimerTypeRadial);spriteProgress->setPercentage(0);this->addChild(spriteProgress,1);//执行动画spriteProgress->runAction(CCRepeatForever::create(CCProgressTo::create(5,100)));
运行
有点象技能冷却完成的效果哈
今天就到这来。还有菜单,下一篇介绍,UI系统就算完成了,
记得多看源码,能学到很多知识的
总结一下:
进度条的创建,和几个重要的方法
midpoint,barchangeRate,settype,percentage
的理解
scheduleUpdate
再次重点使用了getChildByTag
分析源码get、set宏的再次介绍
最后一个实例,用到锚点和设置透明度
附源码
- Cocos2D-X2.2.3学习笔记6(UI系统)
- Cocos2D-X2.2.3学习笔记5(UI系统)
- Cocos2D-X2.2.3学习笔记2(坐标系统)
- Cocos2D-X2.2.3学习笔记17(粒子系统)
- Cocos2D-X2.2.3学习笔记19(地图系统)
- Cocos2D-X2.2.3学习笔记20(地图系统)
- Cocos2D-X2.2.3学习笔记10(几何图形)
- cocos2d-x2.2.3学习
- Cocos2D-X2.2.3学习笔记3(内存管理)
- Cocos2D-X2.2.3学习笔记4(内存管理)
- Cocos2D-X2.2.3学习笔记11(贝塞尔曲线)
- Cocos2D-X2.2.3学习笔记12(瞬时动作)
- Cocos2D-X2.2.3学习笔记13(延时动作)
- Cocos2D-X2.2.3学习笔记14(延时动作)
- Cocos2D-X2.2.3学习笔记16(缓存机制)
- Cocos2D-X2.2.3学习笔记18(场景切换)
- mac下cocos2d-x2.2.3如何获取json文件 ui
- Cocos2D-X2.2.3学习笔记1(vs开发环境和Android环境交叉编译)
- python解析网页中javascript动态添加的内容 一
- Mac OS X 隐藏进程相关资料
- 记一次失败的尝试--ubuntu下把笔记本无线网卡的驱动替换掉
- iOS开发之bug记录1
- MAC OS X 下常用工具
- Cocos2D-X2.2.3学习笔记6(UI系统)
- 第十二周 项目1 项目1 - 长颈鹿类对动物类的继承
- 新辰:对个人站长职业前景的探讨之路在何方?
- 【进程管理】进程三部曲:创建,执行与消亡(综述)
- Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this co
- Mahout之SequenceFilesFromDirectory
- Linux系统挂载数据盘
- ArcGIS Server for Java的REST接口无法访问的问题 .
- java debug 渗透测试