天天看点

cocos2d-x-3.1 Text Labels(官方译文)

介绍

cocos2d支持(true type字体)标签,和纹理地图集标签。

LabelTTF 标签的优缺点:

  • 所有 TTF 字体的优点: 任意大小,支持调整字距.
  • 易于使用. 不需要外部编辑器.
  • 创建或更新非常慢,是因为会创建一个新的纹理, 尤其是在Android设备上.

LabelAtlas, LabelBMFont 优缺点:

  • 创建和更新非常快, 是因为不会创建一个新的纹理.
  • 字体可以进行定制 (阴影, 渐变, 模糊, 等)
  • 依赖于外部编辑器: AngelCode / Hiero editor, GIMP / Photoshop
  • 如果缩放文本会失真

标签对象

cocos2d-x-3.1 Text Labels(官方译文)

创建标签: 简单方式

事例:

LabelTTF* ttf1 = LabelTTF::create("Hello World", "Helvetica", 12, Size(245, 32), TextHAlignment::CENTER);
           

fontName 是TTF字体所用的名字. 你也可以使用自己定义的TTF文件. 你只需要将 .ttf 的文件添加到你的项目中即可.

如果加载字体失败,它会使用UIFont类.

注意: OpenGL的纹理大小会基于字体的大小和字体的名称进行自动计算.

创建标签: 复杂方式

你也可以使用下面的API创建纹理:

LabelTTF* LabelTTF::create(const char *string, const char *fontName, float fontSize,
                               const Size &dimensions, TextAlignment hAlignment, 
                               VerticalTextAlignment vAlignment)
           

注意:如果你使用这种方式, 你只能使用OpenGL的纹理尺寸.如果纹理不够大, 只有部分的标签将被渲染.

对齐方式

* TextAlignmentLeft (left alignment)

* TextAlignmentCenter (center alignment)

* TextAlignmentRight (right alignment)

如果你想修改对齐的方式可以使用 anchorPoint 属性. 事例:

//left alignment
label->setAnchorPoint(Vec2(0,0.5f)); 
// right alignment
label->setAnchorPoint(Vec2(1,0.5f));
// center aligment (default)
label->setAnchorPoint(Vec2(0.5f,0.5f));
           

文字内容

事例:

label->setString("Hello World 2");
           

注意: 你每次 

setString

 将会创建一个新的 OpenGL 纹理. 这意味着 

setString

 会创建一个新的 Label 而变的非常慢. 所以, 不要使用

Label

对象, 如果你想经常的更新它们. 可以考虑使用 

LabelAtlas

 来代替.

Color

你只需要调用颜色参数就可以改变你的字体颜色如下:

label.setColor(Color3B(0,0,0)); // or
label.setColor(Color4B(0,0,0,0)); // setOpacity
           

Color3B 颜色事例:

* white - (255,255,255)
* black - (0,0,0)
* blue - (0,0,255)
* green- (0,255,0)
* red - (255,0,0)
* Grey – (84,84,84)
* Brown – (165,42,42)
* Pink – (255,192,203)
* Purple – (160,32,240)
* Yellow – (255,255,0)
* Gold – (255,215,0)
      

LabelBMFont标签

cocos2d-x-3.1 Text Labels(官方译文)

介绍

建议使用LabelBMFont 的方式来快速创建标签:

  • 可以定制和编辑位图(图片)
  • 你可以更新或初始化标签而没有消耗
  • 它非常灵活.每个字母的标签都可以当作一个Sprite
  • 支持字距的调整

LabelBMFont标签解析是以官方代码格式来创建一个标签.要创建这些类的标签,你可以用这些编辑器:

http://www.n4te.com/hiero/hiero.jnlp (java version)

http://slick.cokeandcode.com/demos/hiero.jnlp (java version)

http://www.angelcode.com/products/bmfont/ (windows only)

http://glyphdesigner.71squared.com/ (Mac only)

http://www.bmglyph.com (Mac only)

http://tinyfont.com (Mac only)

Java编辑器与Windows的编辑器:

Windows编辑器是官方的代码编辑器

Java编辑器:在Mac上运行

Java编辑器:有额外的功能,如阴影,渐变,模糊

创建一个LabelBMFont标签

事例:

LabelBMFont *label =LabelBMFont::create("hello font", "fonts/markerFelt.fnt", size.width/1.5, TextHAlignment::CENTER);
      

因为字体大小是固定的,你需要仔细考虑你需要的字体大小.由于纹理存储器,单独的每个大小的字体可能是低效的.在这种情况下,它缩小标签可能是有意义的,以实现不同的尺寸的大字体.由于标签仅仅是一个Node,你可以通过scale属性来实现

操作每个字符

由于CCLabelBMFont是CCSpriteSheet的子类,你可以像一个CCSprite一样操纵的每个字符.第一个字符将用tag= 0添加,第二个字符将用tag= 1添加,依此类推 示例:

LabelBMFont *label =LabelBMFont::create("Bitmap Font Atlas" , "bitmapFontTest.fnt");
Sprite *char_B = label->getChildByTag(0); // character 'B'
Sprite *char_m = label->getChildByTag(3); // character 'm'
           

LabelAtlas标签

cocos2d-x-3.1 Text Labels(官方译文)

介绍

LabelAtlas是最快添加到cocos2d的标签,但它被BitmapFontAtlas所取代。LabelAtlas保持向后兼容性,但是你应该使用BitmapFontAtlas代替。

创建一个LabelAtlas标签

LabelAtlas* LabelAtlas::create(const char *string, const char *charMapFile, unsigned int itemWidth, int unsigned itemHeight, unsigned int startCharMap);
           

事例:

LabelAtlas *label1 = LabelAtlas::create ("Hello World","tuffy_bold_italic-charmap.png",48,64 ,' ');
           

CharMapFile

  • charMapFile是一个包含了所有的字符的图像文件,每个字符根据其ASCII值排序,图像不能包含超过256个字符
  • itemWidth是字符的宽度(以像素为单位)
  • itemHeight是字符的高度(以像素为单位)
  • startCharMap是在地图的第一个字符。

LabelTTF 与 LabelAtlas

LabelTTF和LabelAtlas之间的主要区别是地图集版本(像所有其他的地图集类),使用一个预渲染所有字符的大纹理来绘制一个字符串。这意味着,绘图的速度要快得多,因为如果你画100个标签,图形处理器不会读取100个纹理,但只是在内存中保持一个纹理。但是,这也意味着,所有的字母将有一个固定的大小。如果你想要避开固定大小的限制,使用CCBitmapFontAtlas。

LabelTTF为每个标签创建一个纹理,因而LabelAtlas使用所提供的纹理(包含所有字符),能快速地渲染文字,因此使用LabelAtlas降低了内存消耗。