原文链接: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 类型,提高了程序的健壮性。