cocos2d-x 中添加显示文字的三种方式 LabelTTF 、LabelBMFont 和 LabelAtlas

在 cocos2d-x 中有三个类可以在层或精灵中添加文字:

  • LabelTTF
  • LabelBMFont
  • LabelAtlas

LabelTTF 直接支持使用 TTF 字库,可以支持全部的中文,但是效率稍低。LabelBMFont 适合显示特定的文字,通过预先将文字生成图片,提高了效率,但是不能支持全部中文。如果使用的文字不多,组合多,但是文字的编码是连续的,比如数字,或者英文字符,那么 LabelAtlas 更加适合你。

LabelTTF

先说 LabelTTF , TTF(TrueType Font) 是一种字库规范,是 Apple 公司和 Microsoft 公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式。

在 Windows Phone 中使用的时候,我们需要把字库文件保存在 Resources\fonts 文件夹下面,保证 Cocos2d-x 能够找到字体。下面我们考虑在程序中使用字体 Consolas 显示一个字符串。

在系统文件夹 C:\Windows\Fonts 中找到 Consolas 字体,选中之后,进行复制。

复制到我们 Resources\fonts 文件夹中。

特别说明:

在 Andiord 和 iOS 中,代码中通过字体的名称,而不是字体文件的名称来使用字体。但是,在 Windows Phone 中,却不使用真实的字体名称,而是使用字体文件的名称来使用字体。

我们在前面复制过来的字体文件名称实际上是 consola.ttf,为了在后面使用这种字体,你需要将字体文件的名称改为 consolas.ttf 。或者字体名称使用 Consola 。

代码中可以如下使用字体来创建标签。

LabelTTF *label = LabelTTF::create("exp:+1234567", "Consolas", 40);
label->setPosition(visibleSize.width / 2, visibleSize.height / 2);
addChild(label);

或者使用 TTFConfig ,好处是可以重复使用字体的配置信息,不用每次都指定字体名称和尺寸。

TTFConfig ttfConfig("fonts/Consolas.ttf", 24);
auto labelHello = Label::createWithTTF(ttfConfig, "Hello, TTFConfig");
labelHello->setPosition(visibleSize.width / 2, visibleSize.height / 2);
labelHello->setString("Reset String");
addChild(labelHello);

文字是如何显示在 UI 上的呢?实际上 Label 需要从字库中抽取字形,通过字形创建图片纹理,然后才能显示出来。如果字库比较大,比如说中文字库,我们没有使用字库中所有的文字,那么一个几 M 的字库文件就很浪费空间了,每次的重新生成纹理就更加浪费资源。我们可以考虑不使用字体文件,而直接准备好文字的图片直接显示在 UI 上。

LabelBMFont

LabelTTF 每次调用 setString (即改变文字)的时候,一个新的 OpenGL 纹理将会被创建.。这意味着setString 和创建一个新的标签一样慢。 所以,当你需要频繁的更新它们的时候,尽可能的不用去使用标签对象。 LabelAtlas 或者 LabelBMFont 可以帮助我们实现这种效果。

首先,我们使用一个工具来帮助我们从字库文件中抽取字形,生成我们需要的图片,这个工具称为 Bitmap Font Generator,可以直接下载到。

现在有两个版本,我们直接使用最新的 v1.14 beta 来处理。先安装一下。

下面启动起来

进行字体设定,我们使用微软雅黑来支持一下中文。

在弹出的对话框中选择微软雅黑,进行具体的设置。

然后,打开记事本,创建一个文本文件,写入你希望使用的文字,注意,在保存的使用要选择 Utf-8 格式。

然后,在 Bitmap font generator 的 Edit 菜单中,通过 Select chars form file 来选择你刚刚创建的文本文件,成功之后,你会在 Bitmap font generator 中看到你使用的文字已经被选中了。

现在,可以导出图片了。

看导出的对话框。

Padding,文字的内边框,或者理解为文字的周边留空要多大 做后期样式时这个属性很重要,需要预留空间来给描边、发光等特效使用 比如我预计我的样式要加一个2px的边框,然后加一个右下角2px的投影效果,所以我设定了padding:2px 4px 4px 2px

BitDepth,必须32位,否则没有透明层

Presets,字体初始化的预设的颜色通道设定,也就是说字体的初始颜色设定是什么样的,建议都用白色字,可以直接设定为White text with alpha,即白色字透明底。

Font descript,字体描述文件,可以使用text或者xml 也就是fnt文件格式

Textures,纹理图片格式,果断png。

最后,导出图片文件。

终于可以使用一下了。

首先,在资源中创建一个 xml 格式的 plist 文件,在其中定义我们希望显示的字符串。我们将这个文件直接保存在 Resources 的目录之下,名为 string.xml.

<?xml version="1.0" encoding="utf-8" ?>
<plist version="1.0"><dict><key>name</key><string>你好,Microsoft 雅黑</string></dict>
</plist>

将我们刚刚生成的两个字体文件也复制到这个目录下。

CCDictionary *strings = CCDictionary::createWithContentsOfFile("string.xml");
const char *charchinese = ((CCString*)strings->objectForKey("name"))->getCString();
LabelBMFont *label = LabelBMFont::create(charchinese, "helloFont.fnt");
label->setPosition(visibleSize.width / 2, visibleSize.height / 2);
addChild(label);

运行程序,就可以看到我们输出了,显示同样的文字,我们仅仅需要一张 3.43k 的图片文件就可以了。

如果无法使用,可以查看一下ccConfig.h中的CC_FONT_LABEL_SUPPORT是否enable了。

CCLabelBMFont CCLabelBMFont 相当于每次改变只改变了图片坐标,而CCLabelTTF要重新渲染.这个类使用之前,需要添加好字体文件,包括一个图片文件 (**.png) 和一个 字体坐标文件 (**.fnt)。 在 cocos2d-x的示例项目中有现成的,可以先拿过来练习一下,找的时候注意两个文件的 名称是相同的,只是扩展名不同。

这个没办法指定字体的字号,但可以用 scale 属性进行缩放来调整大小。就当它是sprite。

LabelAtlas

如果你用cocos2d-x项目模板创建过项目,那么你已经看过它的效果了,就是左下角显示帧率的数字。 因为帧率一直在变,使用CCLabelTTF的话效率太低,因为只是数字所以也犯不上使用 CCLabelBMFont 加载那么大的文字图像,所以使用这个比较合适。

比如说,我们准备显示 0-9 十个数字,我们可以在一张图片中制作好这十个数字。每个数字都有相同的宽度和高度。将它保存在资源中。别忘了设置复制。

比较重要的是,这十个数字要按照 ASCII 顺序排列,我们要设置第一个字符的 ASCII 编码,这样,Cocos2d-x 就可以直接计算出不同字符对应的图形了。

CCLabelAtlas* diceCount=CCLabelAtlas::labelWithString("1:", "nums_font.png", 14, 21, '0');

第一个参数:显示的内容:1x,你也许会奇怪为什么是1x,因为使用的png图必须是连续的,因为程序内部是议连续的scall码识别的。9的后一位的”:“,所以先实现x就得用”:“代替。

第二个参数:图片的名字

第三个参数:每一个数字的宽

第四个参数:每一个数字的高

每五个数字:开始字符

LabelAtlas* diceCount = CCLabelAtlas::create("100:", "nums_font.png", 14, 21, '0');
diceCount->setPosition(Point(visibleSize.width - 150, visibleSize.height / 2 - 50));
addChild(diceCount);

cocos2dx中的文字显示相关推荐

  1. android矩形输入框,Android中实现在矩形框中输入文字显示剩余字数的功能

    虽然这两个功能都比较简单,但是在实际app开发中真的很常见,特别是显示字数或剩余字数这个功能 如下图: 要实现上面的功能,需要做到三点: 1.实现矩形框布局 思路就是矩形框作为整个布局的一个backg ...

  2. word表格中部分文字显示不全文字右侧或底部不能完整显示

    文字上面好像被削了一样 缩小字体,段落--行距--固定值 调整一下就ok,这个就是段落的问题,调整一下行距就好了. 插入表格--在"自动调整"操作中--点上根据内容调整表格就可以了 ...

  3. 浅谈Unity中的文字显示

    以UGUI系统为例,字体分为内置字体.外部导入字体.自定义字体. 文字一般通过Text组件进行显示.目前Unity已经官方支持TextMeshPro,因此也有一些文字通过TextMeshPro-Tex ...

  4. quartus模块图中模块文字显示不全

    解决方法: 关闭quartus程序,右键程序图标,点击属性 =>兼容性=>更改高DPI设置 打勾 替代高DPI缩放行为,缩放执行 选择 系统(增强) 确定后重新打开 问题解决啦

  5. CAD文字显示为方框怎么办?CAD文字显示为方框的解决办法

    有些小伙伴在CAD软件中打开图纸后发现之前图纸中正常显示的CAD文字数字,突然都不见了,这是怎么回事呢?其实出现这种状况很好解决,下面小编就来给大家介绍一下浩辰CAD软件中CAD文字显示为方框的解决办 ...

  6. cocos2d-x 中添加显示文字的三种方式 LabelTTF 、LabelBMFont 和 LabelAtlas

    在 cocos2d-x 中有三个类可以在层或精灵中添加文字: LabelTTF LabelBMFont LabelAtlas LabelTTF 直接支持使用 TTF 字库,可以支持全部的中文,但是效率 ...

  7. cocos2d-x学习之添加显示文字

    cocos2d 中添加显示文字的三种方式(CCLabelTTF .CCLabelBMFont 和CCLabelAtlas) 在 cocos2d 中有三个类可以在层或精灵中添加文字: CCLabelTT ...

  8. 在Word2010文档中设置和显示隐藏文字

    用户在使用Word2010编辑文档的过程中,常常需要将Word文档中的特定文字设置为隐藏文字,以实现保密效果.本篇教程介绍在Word2010文档中设置和显示隐藏文字的方法. 1.设置隐藏文字 用户可以 ...

  9. css中横线中间显示文字

    css中横线中间显示文字,类似文档地图注脚 <div style="width:100%;height:36px;line-height:36px;display:flex;" ...

最新文章

  1. SSM整合及CRUD实现
  2. blob转file对象_JavaScript Blob 对象解析
  3. maven依赖包下载地址
  4. 装上了Visual Studio 2005
  5. php 档案,PHP 档案包 (PHAR)
  6. ssh源码编译安装mysql_总结源码编译安装mysql
  7. java gps 距离计算_Java教程之地图中计算两个GPS坐标点的距离
  8. Spring Bean的序列化方案
  9. Python字符串title()
  10. 发现《后端架构师技术图谱》
  11. php 公众号采集器,别跑,教你微信公众号文章采集! - 八爪鱼采集器
  12. 图片和文本置顶显示的方法
  13. 服务器硬件防火墙和软件防火墙的功能和区别
  14. 关于传奇自动触发的几个常用脚本OnKillMob、StdModeFunc、等触发事件
  15. 常用街机模拟器机台设置[更新中](新手看)
  16. 100部最佳美国影片
  17. JMC | 基于机器学习精确预测激酶抑制剂结合模式
  18. re匹配中文格式的字符
  19. 第八集 昆仑初度尘未洗,夜宿禁区五道梁
  20. C r e a t e P r o c e s s的b I n h e r i t H a n d l e s参数

热门文章

  1. 手把手带你使用uni-admin搭建后台管理系统
  2. 视频解读 | 国家发展改革委“我为数据基础制度建言献策活动”相关制度建议解读...
  3. mysql子查询多字段_(mysql)多个字段需要子查询,求优化
  4. 手把手教你写Python网络爬虫:网易云音乐歌单
  5. Word自定义快捷键:将粘贴内容设为纯文本格式
  6. Android复杂二维码扫描
  7. JS 3.3 阶乘运算:斐波那契数列
  8. 为什么手机网速太慢_手机信号满格,为什么网速却很慢,只要1个设置让你手机快如飞!...
  9. 看见的,看不见了;记住的,遗忘了;看不见的,看见了;遗忘的,记住了。
  10. 2022年二级建造师《专业工程(水利)》每日一练考试真题及答案