cocos2d-x label字符串不同大小

2015年01月12日 15:28 0 点赞 0 评论 更新于 2025-11-21 14:05

在 Cocos2d-x 3.x 版本中,废弃了 2.x 里的 LabelTTFLabelAtlasLabelBMFont 三个字体类,取而代之的是全新的字体标签 Label。实际上,Label 将这三个字体类进行了融合,实现了统一的管理与渲染,这使得创建字体标签 Label 的方式更加统一和方便。

3.x 中 Label 的特性

在 3.x 中,Label 支持四种方式的标签创建,新增了阴影(Shadow)、轮廓(Outline)、发光(Glow)效果的支持,还支持文字内容的行间距、文字间距、自动换行的设置。

创建方式

  1. 创建系统原生字体 APIcreateWithSystemFont
  2. 创建 TTFcreateWithTTF(原 LabelTTF
  3. 创建 CharMapcreateWithCharMap(原 LabelAtlas
  4. 创建 BMFontcreateWithBMFont(原 LabelBMFont

Label 的属性与方法

  • 文字效果渲染ShadowOutlineGlow
  • 对齐方式TextHAlignmentTextVAlignment
  • Label 的尺寸大小
  • 自动换行
  • 行间距、文字间距
  • 单独设置某个字符

PS:关于图片资源,请在 Cocos2dx 给出的官方样例 cpp-tests 中寻找。

具体创建方式

createWithSystemFont

这是创建系统原生字体的 API,创建方式如下:

static Label* createWithSystemFont(
const std::string& text,             // 字符串内容
const std::string& font,             // 字体(字体名称、或字体文件)
float fontSize,                      // 字号
const Size& dimensions = Size::ZERO, // label 的尺寸大小,默认不设置尺寸
TextHAlignment hAlignment = TextHAlignment::LEFT, // 水平对齐方式,默认左对齐
TextVAlignment vAlignment = TextVAlignment::TOP   // 垂直对齐方式,默认顶部对齐
);

使用举例

// 使用系统的字体名称 "Arial" 来创建
Label* lb1 = Label::createWithSystemFont("123abc", "Arial", 24);

createWithTTF

创建 TTF 的方式有以下两种:

方式一:与 2.x 中 LabelTTF 的创建类似

不过使用的 fontFile 必须为字体文件,不支持使用系统字体名称来创建。

方式二:通过 TTF 的配置信息数据结构 TTFConfig 来创建

1. TTFConfig 配置
typedef struct _ttfConfig
{
std::string fontFilePath;  // 字体文件路径,如 "fonts/Arial.ttf"
int fontSize;              // 字体大小,默认 12
GlyphCollection glyphs;    // 使用的字符集,默认 "DYNAMIC"
const char *customGlyphs;
bool distanceFieldEnabled; // 是否让字体紧凑,默认 false
int outlineSize;           // 字体轮廓大小,默认 0

// 构造函数
_ttfConfig(
const char* filePath = "",
int size = 12,
const GlyphCollection& glyphCollection = GlyphCollection::DYNAMIC,
const char *customGlyphCollection = nullptr,
bool useDistanceField = false,
int outline = 0
);
} TTFConfig;

2. 使用 TTFConfig 创建 TTF
TTFConfig ttfConfig;
ttfConfig.fontFilePath = "fonts/Marker Felt.ttf"; // 必须配置
ttfConfig.fontSize = 12;
ttfConfig.distanceFieldEnabled = false;
ttfConfig.outlineSize = 0;
ttfConfig.glyphs = GlyphCollection::DYNAMIC;
ttfConfig.customGlyphs = nullptr;

// 使用 TTFConfig 配置,来创建 TTF
Label* lb3 = Label::createWithTTF(ttfConfig, "123abc");

createWithCharMap

CharMap 的用法与 2.x 中的 LabelAtlas 一样,一般用来显示数字,不过也可以用来显示其他字符,如英文字符。字体文件资源一般来自一张 .png 图片,或 .plist 文件。

注意:图片中每个字符的大小必须是固定的,若要改变字体大小,只能通过 setScale 放缩来实现。

创建 CharMap 有三种方式:

  • 使用 .png 图片创建
  • 使用纹理 Texture2D 创建
  • 使用 .plist 创建

从图片中从左到右,一块一块截取。从字符 startCharMap 开始一一对应,第一块小图片对应字符 startCharMap;第二块小图片对应字符 startCharMap + 1;第三块对应 startCharMap + 2……以此类推。

注意startCharMap 为 ASCII 码,即数字 '0' 为 48。

// 使用 .png 图片创建
static Label* createWithCharMap(const std::string& charMapFile, int itemWidth, int itemHeight, int startCharMap);
// 使用纹理 Texture2D 创建
static Label* createWithCharMap(Texture2D* texture, int itemWidth, int itemHeight, int startCharMap);
// 使用 .plist 创建
static Label* createWithCharMap(const std::string& plistFile);