cocos2d-x 3.0对label的改进
原文链接:http://www.cocoachina.com/bbs/read.php?tid=217183
在游戏创作的过程中,你可以通过画面传递场景信息,通过声音来渲染气氛,而Label是最直接明了让世界懂我们的方式吧!所以我们必须学会如何应用Label,Cocos2d-x-3.0创建文本的方式较之前的版本发生了改变,原版本中的类CCLabelTTF,CCLabelBMFont,CCLabelAtlas现在合并为一个类Label,通过调用Label不同的创建方法来实现原版本的上述三个类的功能,当然之前的类也是可以使用的,只不过被声明为deprecated。
相比于之前版本调用系统API来创建字符纹理的低效率,新的label使用了freetype(http://www.freetype.org/)第三方库来包装各个平台,做到了字符显示效果的一致,并且缓存了字符纹理提高了效率,之前使用系统API创建文本的方式在3.x下的接口是Label::createWithSystemFont()。
在使用lable,BMFont,charMap之前,首先必须明确一下他们各自的适用场景,lable这个东西就不用说了把,所有的文本信息理论上都可以用他来做,BMFont可以通过图片编辑软件二次编辑效果,做出你想要的文本样式,就是一些比较炫的艺术字,在2.x的时候CCLabelAtlas的存在是为了提高效率,它经常用来显示数字,3.x的时候这家伙已经更名为CharMap,CharMap的存在一个是为了兼容之前的版本,另外也可以使用图片编辑软件二次编辑效果,做一些很炫的数字。
Label的基本使用方法
createWithSystemFont()是通过调用系统API创建Label的方法,这种方式创建的label效率不高,不推荐使用。
1
2
3
4
|
//第一个参数是要显示的文本内容,第二个参数不存在的话将会使用系统API来创建文本,存在的话内部调用的是createWithTTF创建,第四个参数是文本域的大小,第五个和第六个是对齐方式,后三个参数可以省略
auto label = Label::createWithSystemFont( "create label through label class" , "fonts/Marker Felt.ttf" ,32,Size(240,160),TextHAlignment::LEFT,TextVAlignment::TOP);
label->setPosition(Point(size.width/2,size.height/2));
this ->addChild(label);
|
1、创建LabelTTF
LabelTTF对应于原来版本的CCLabelTTF,3.0的createWithTTF一开始要加载字符纹理,较2.x版本效率有明显提高。使用如下的俩种方式来创建LabelTTF,第一种方式传入参数的时候省略了后三个参数,第二个是使用结构体TTFConfig配置了Label的属性,为TTFConfig赋值的时候有些参数是必须的,而有些系统会提供默认参数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//创建label的第一种方式,参数分别是显示的文本,所用的字体文件,文本大小
auto label = Label::createWithTTF( "label test" , "fonts/Marker Felt.ttf" ,32);
label->setPosition(Point(size.width/2,size.height*0.6));
this ->addChild(label);
//创建label的第二种方式,通过设置配置信息TTFConfig来创建文本,TTFConfig是一个结构体
TTFConfig label_config;
//fontFilePath设置所使用的字体文件,必须设置,其他的几项系统都有默认值
label_config.fontFilePath = "fonts/Marker Felt.ttf" ;
//fontSize设置字体大小
label_config.fontSize = 32;
//使用的字符集,字符集用于一开始缓存创建哪些字符纹理,当前字符集支持 Dynamic,nehe,Ascii,custom 4种
label_config.glyphs = GlyphCollection::DYNAMIC;
//用户字符集
label_config.customGlyphs = nullptr ;
label_config.distanceFieldEnabled = false ;
//字体锚边的大小
label_config.outlineSize = 0;
//传入配置信息和需要显示的文本
auto label_two = Label::createWithTTF(label_config, "label test" );
label_two->setPosition(Point(size.width/2,size.height*0.5));
this ->addChild(label_two);
|
这里有必要对distanceField的用法做一个解释,首先我们创建一个文本,然后将文本放到四倍,看下效果。
可以看到,文本被放大以后有明显的锯齿,显示效果也不好看了,这段代码在这里。
1
2
3
4
5
6
7
8
9
10
|
TTFConfig config;
config.fontSize = 32;
config.fontFilePath = "fonts/Marker Felt.ttf" ;
//config.distanceFieldEnabled = true;
auto label = Label::createWithTTF(config, "Label Test" );
label->setPosition(Point(size.width/2,size.height/2));
this ->addChild(label);
label->setScale(4.0f);
|
现在打开我注释掉得 config.distanceFieldEnabled = true;效果如下:
可以看到锯齿没有了,字体效果也比较好了,所以你也看到distanceFieldEnabled的作用了把,这个参数默认是false,原因就是使用distanceField有两个地方性能有差别 一个是加载纹理的时候需要计算,另一个是渲染的时候每一帧在shader中也有更多的计算,所以事物就是这样啊,有利有弊,怎么选择看你自己了。
1.1、以下来说明几个函数的用法
这些函数是设置文本的一些特殊效果,包括描边,阴影,荧光,行高和字符间距。
1
2
3
4
5
6
|
//设置描边的颜色,第二个参数可以传入描边的大小,大小不能为0,否则的话就看不到描边的效果了,描边和荧光只适用使用createWithTTF创建的文本
label_two->enableOutline(Color4B(255,0,0,255),5);
//荧光的效果,distanceFieldEnabled需要设置为true,outlineSize为0
label_three->enableGlow(Color4B(255,0,0,255));
//阴影效果,第一个参数是影子的颜色,默认是黑色,第二个参数是偏移量, 第三个参数是模糊半径
label_four->enableShadow(Color4B(0,0,255,255),Size(3,10),0);
|
2、创建BMFont
为了使用BMFont,首先你需要准备一个.fnt文件和.png图片,在这些文件中包含了你想要的字符信息,这俩个资源是使用一些字体工具来获得的。传入参数的时候只需要传入.fnt就可以了。
1
2
3
4
5
6
7
8
|
//创建BMFont,第一个参数是.fnt文件,第二个参数是要显示的文本,文本信息的内容必须包含在fnt的文件中,否则显示不出来
auto bmfont = Label::createWithBMFont( "fonts/gameover_score_num.fnt" , "123456789" );
bmfont->setPosition(Point(size.width/2,size.height/2));
//阴影效果,没有描边和荧光,因为是从PNG中读取的图片
bmfont->enableShadow(Color4B(0,255,0,255),Size(5,10));
this ->addChild(bmfont);
//取消所有特效
//bmfont->disableEffect();
|
3、创建CharMap
资源文件同样是需要一些字体工具来做的,而且你还需要知道字符的宽和高,相比前俩种方式,显的比较费事。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//创建charMap 参数分别为:png图片的路径,每个字符的宽和高,起始字符
auto charMap = Label::createWithCharMap( "fonts/tuffy_bold_italic-charmap.png" , 48, 64, ' ' );
charMap->setPosition(Point(size.width/2,size.height*0.4));
//需要设置一下显示的文本信息
charMap->setString( "123456789" );
this ->addChild(charMap);
//也可以使用.plist文件来创建charMap
auto charMap2 = Label::createWithCharMap( "fonts/tuffy_bold_italic-charmap.plist" );
charMap2->setPosition(Point(Point(size.width/2,size.height*0.3)));
//需要设置一下显示的文本信息
charMap2->setString( "123456789" );
this ->addChild(charMap2);
|
二、较2.X版本的变化
- 去掉了类、结构体和宏的CC前缀和一些其他类似匈牙利命名方式的前缀,例如m、p等等;
- 改变了成员函数中某些参数和返回值的数据类型,比如char换成了string、unsigned int换成了long等等;
- 改变了某些枚举类型的名字和属性值;将引擎中不会被修改数据成员的函数都声明成了const 类型,提高了程序的健壮性。
cocos2d-x 3.0对label的改进相关推荐
- 图文并茂使用CocosBuilder制作Cocos2D游戏 分享0
图文并茂使用CocosBuilder制作Cocos2D游戏 分享0 目 录 The Game 设置工程 创建动画类型的主界面 本文由Zynga 工程师原创,翻译:Iven,张作宸,Butterfly ...
- 如何制作一个横版格斗过关游戏 Cocos2d x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...
- 【完全解析】Lumion 9.0 新功能与改进
作者:活力网Andrew Hi,大家好,我是Andrew Lumion9.0正式出来得瑟啦! 去年的lu8已经让大家很震撼啦 当大家都觉得撸妹儿已经到达一定高度的时候 今天的lu9再次惊艳! 今天我们 ...
- 编译原理三级项目PL/0的研究与改进
PL/0的研究与改进 1.扩充else语句 if-then-else语句的EBNF范式描述 <条件语句>:=if<条件>then<语句>[else <语句&g ...
- linux内置usb3.0驱动,基于嵌入式Linux的USB3.0视频驱动的改进
作 者:孙红[1,2] 秦守文[1] Sun Hong , Qin Shouwen (1. School of Optical--Electrical and Computer Engineering ...
- 译 | .NET Core 3.0 对诊断的改进
原文:Sourabh Shirhatti 翻译:Edi Wang 在 .NET Core 3.0 中,我们将引入一套工具,这些工具利用 .NET 运行时中的新功能,使诊断和解决性能问题变得更加容易. ...
- 如何制作一个简单的游戏 Cocos2d x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(八)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 回到Xcode中,新建一个EndLayer类,继承于CCNode ...
- 如何制作一个横版格斗过关游戏 2 Cocos2d x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在第一篇 ...
- Cocos2d x 2 0 从HelloWorld入手
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 从上一篇 ...
最新文章
- namecheap教程
- pyqt5讲解10:布局管理讲解大全
- 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析
- php-ml案例,AppML 案例原型
- sprongboot mysql登录注册_后端开发:SpringBoot实现注册与登录功能
- c语言状态机_【C语言】有限状态机FSM
- python中属性与方法_python中属性和方法的动态绑定
- Broadwell I7-5775c/5675c BSOD 蓝屏问题
- [导入]Asp.Net MVC实践 - 探索UrlRouting并分析UrlHelper (基于ASP.NET MVC Preview 3)
- VB.NET的数据库基础编程[zz]
- PHP处理CSV表格文件的常用操作方法是怎么样呢
- 对C语言指针的学习与理解
- python代码变成手机软件_使用Python代码的程序员也浪漫
- 必看!超详细的电子元器件选型经验分享
- 【手把手带你Godot游戏开发】Godot界面介绍
- 马云在大学学计算机,IT大佬高考成绩单:李彦宏是状元 马云数学仅1分
- JS如何获取屏幕、浏览器及网页高度宽度?
- 系统集成项目管理工程师学习
- 月饼电商“内卷”?看数据如何驱动营销,全链路精细化运营抢占C位!
- linux学习笔记2——ls命令说明
热门文章
- Python查看文章中每个单词的出现频率
- eclipse debug 的断点查看和清除
- 导入maven项目出现 Unsupported IClasspathEntry kind=4
- 网站遭遇DDoS***的解决方案
- js中的~~、Object.entires用法(转)
- 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.3 SLC Nand Flash芯片
- cygwin1.dll is missing from your computer
- 乐檬:我们和fiil主题词相同是撞车!汪峰信吗?
- xilinx spartan-3a iob
- 一种特殊的多语言解决方案