原文链接: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版本的变化

  1. 去掉了类、结构体和宏的CC前缀和一些其他类似匈牙利命名方式的前缀,例如m、p等等;
  2. 改变了成员函数中某些参数和返回值的数据类型,比如char换成了string、unsigned int换成了long等等;
  3. 改变了某些枚举类型的名字和属性值;将引擎中不会被修改数据成员的函数都声明成了const 类型,提高了程序的健壮性。

cocos2d-x 3.0对label的改进相关推荐

  1. 图文并茂使用CocosBuilder制作Cocos2D游戏 分享0

    图文并茂使用CocosBuilder制作Cocos2D游戏  分享0 目 录 The Game 设置工程 创建动画类型的主界面 本文由Zynga 工程师原创,翻译:Iven,张作宸,Butterfly ...

  2. 如何制作一个横版格斗过关游戏 Cocos2d x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

  3. 【完全解析】Lumion 9.0 新功能与改进

    作者:活力网Andrew Hi,大家好,我是Andrew Lumion9.0正式出来得瑟啦! 去年的lu8已经让大家很震撼啦 当大家都觉得撸妹儿已经到达一定高度的时候 今天的lu9再次惊艳! 今天我们 ...

  4. 编译原理三级项目PL/0的研究与改进

    PL/0的研究与改进 1.扩充else语句 if-then-else语句的EBNF范式描述 <条件语句>:=if<条件>then<语句>[else <语句&g ...

  5. linux内置usb3.0驱动,基于嵌入式Linux的USB3.0视频驱动的改进

    作 者:孙红[1,2] 秦守文[1] Sun Hong , Qin Shouwen (1. School of Optical--Electrical and Computer Engineering ...

  6. 译 | .NET Core 3.0 对诊断的改进

    原文:Sourabh Shirhatti 翻译:Edi Wang 在 .NET Core 3.0 中,我们将引入一套工具,这些工具利用 .NET 运行时中的新功能,使诊断和解决性能问题变得更加容易. ...

  7. 如何制作一个简单的游戏 Cocos2d x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

  8. Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(八)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 回到Xcode中,新建一个EndLayer类,继承于CCNode ...

  9. 如何制作一个横版格斗过关游戏 2 Cocos2d x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在第一篇 ...

  10. Cocos2d x 2 0 从HelloWorld入手

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 从上一篇 ...

最新文章

  1. namecheap教程
  2. pyqt5讲解10:布局管理讲解大全
  3. 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析
  4. php-ml案例,AppML 案例原型
  5. sprongboot mysql登录注册_后端开发:SpringBoot实现注册与登录功能
  6. c语言状态机_【C语言】有限状态机FSM
  7. python中属性与方法_python中属性和方法的动态绑定
  8. Broadwell I7-5775c/5675c BSOD 蓝屏问题
  9. [导入]Asp.Net MVC实践 - 探索UrlRouting并分析UrlHelper (基于ASP.NET MVC Preview 3)
  10. VB.NET的数据库基础编程[zz]
  11. PHP处理CSV表格文件的常用操作方法是怎么样呢
  12. 对C语言指针的学习与理解
  13. python代码变成手机软件_使用Python代码的程序员也浪漫
  14. 必看!超详细的电子元器件选型经验分享
  15. 【手把手带你Godot游戏开发】Godot界面介绍
  16. 马云在大学学计算机,IT大佬高考成绩单:李彦宏是状元 马云数学仅1分
  17. JS如何获取屏幕、浏览器及网页高度宽度?
  18. 系统集成项目管理工程师学习
  19. 月饼电商“内卷”?看数据如何驱动营销,全链路精细化运营抢占C位!
  20. linux学习笔记2——ls命令说明

热门文章

  1. Python查看文章中每个单词的出现频率
  2. eclipse debug 的断点查看和清除
  3. 导入maven项目出现 Unsupported IClasspathEntry kind=4
  4. 网站遭遇DDoS***的解决方案
  5. js中的~~、Object.entires用法(转)
  6. 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.3 SLC Nand Flash芯片
  7. cygwin1.dll is missing from your computer
  8. 乐檬:我们和fiil主题词相同是撞车!汪峰信吗?
  9. xilinx spartan-3a iob
  10. 一种特殊的多语言解决方案