在cocos2d-x中使用位图字体
http://blog.csdn.net/fansongy/article/details/9006677
通常情况下,游戏中绚丽的文字和数字都不是字体生成的而是“贴”上去!今天,我就在这里为大家介绍一个使用了图片打包技术的位图字体生成工具——BMFont。
1、先下载一个BMFont(下载地址:http://www.angelcode.com/products/bmfont/)
2、运行程序,单击鼠标左键点亮相应位置的字母,比如:0、1、2、/ 等。

3、选择 Edit->Open Image Manager。弹出一个“Image Manager" 对话框。

4、点击Image->import Image.在弹出的对话框中选择对应的图片路径。假如在你的文件夹下,有10张数字为1-10的png图片,将他们添加进来。

必填项是id。其他属性设置根据你的需求而定!
5、然后指定对应的id。此id就是要替换的字符的标识。可以将鼠标悬停在对应的格子上,右下角的“48:30"中的第一项即是Id号。

从图中可以看出,数字0对应的id是48.
6、设定x,y的偏移量(看需求)
7、点ok并逐一添加相应的字体。
8、点击Option->Export options,在弹出的对话框中选择Bit depth:32

Padding:字体四周的间距。如果生成的png图片,你觉得还不够酷的话,可以在ps里面继续处理。不过为了使描述文件不受影响,我们可以通过设置Padding为字体留下足够的空间。这个值会影响实际效果的显示。如果值过大,字与字之间的距离就变大了,通过代码调整间距很麻烦的。
Spacing:字体与字体之间的间距
Width/Height:导出图片的大小
Bit depth:位图深度
Font descriptor:BMFont生成的.fnt文件的描述形式
Texture:支持三种格式dds、png、tga。由于我们要在cocos2d-x中使用,自然是选择png格式。
9、点击Option->Save bitmap font as...
10、输入相应的保存名。例如"abc"。则会生成abc.fnt和abc_0.dds(或abc_0.png或abc_0.tga)文件。
最后提出一个问题:如果我们使用中文的图片,那么我们该怎么知道这个中文汉字在bmfont中的字符id呢,其实就是Unicode码?
不知道你有没有注意到bmfont右侧这一栏。

我们的突破口就在这里!!知道什么叫CJK吗?(http://baike.baidu.com/view/628156.htm)
通过查找我们需要的中文汉字在CJK的编码,我们就可以知道该中文字体对应的字符id了。比如,中文汉字“你”,对应的编码是4f60,那么在bmfont右侧一栏查找004f开头的CJK。选中汉字“你”。前面我说过,字符id其实就是Unicode,所以如果你想快速的查找汉字对应的字符id,可以通过以下在线转换得到:http://javawind.net/tools/native2ascii.jsp?action=transform。可是在一个页面里面一个一个汉字的去查找我们需要的汉字,多麻烦呀!干脆就把我们所需的汉字保存在.txt文件里。然后导入。剩下的步骤就和上面的步骤一样了。具体如何导入.txt文件。见附录!
附录:中文字体图集制作的方法
很多都是从一个字体文件读取,然后选择需要的字,然后保存成图片文字,这个对于一般的文字的确很实用
Options——Font Settings,进行字体的选择:
这里有几个注意点:
1.font下拉菜单我们可以选择自己喜欢的中文字体,当然您也可以下载第三方的ttf字体通过Add font file这个导入。
2.字体编码,这里默认是unicode
Options——Export Options,接着设置字体的导出选项:
这里有几个注意点:
1.Width和Height的值,4096可以说是最大了,请不要超过这个值,不然做出来的图集太大,会加大drawcall的数量哦~
2.bit depth:根据个人需求选择合适的深度。如果是手机开发的话,选择合适的深度更为重要。
现在我们可以导入自己需要的字体文件了。
在桌面创建一个.txt文本,在里面输入自己想要的文字。
看一下文本属性:
它的编码格式是中文的哦~GB2312。
然后保存,现在回到bmfont:
现在找到我们的文本!!!!!!!!!!!!!!!
选择后发现:
这种错误,为什么?因为bmfont设置的编码格式和我们文本的编码格式不统一!
现在我们统一一下编码就好啦,我这里用的是notepad++
保存一下,重复上面的操作试试~
PS:Font Settings的Font中,选中的字体一定要支持中文字体。不支持的话,会报错字符无效!
需要的字都被选中了~
现在保存出NGUI需要的东西:
得到两个文件.fnt和.png文件。
现在让我们看看fnt文件里面都有什么?

char id=20320,表示纹理图集中的某一个(中文)字;x=91 y=0就是指这个字(符)在png中所在的坐标;
width = 14 height =24,代表字(符)的宽度和高度;page=0,说明这个字,在代表0的page上,也就是dd_0.tga。假设你的纹理图集很多的话,一张图容纳不下的话,bmfont就会分页显示,导出的tga也就有相应的页数。
那当我们要读取这个字的时候我们就会到那张图,找到坐标为(91,0)的地方,然后横向偏移x -2个单元(因为xoffset =-2 )
然后再竖向移4位来开始画这个字。xadvance是横向移动距离,推测引擎应该是这样处理的,调用方传递初始位置X,Y和要画的字符串给绘图函数(其它信息先不考虑),引擎每次从要写的字符串读取一个字符,定位到code所在的字符,然后读取相应的page信息定位到指定图片,然后根据x,y,width,height将相应的矩形画到屏幕X+xoffset,Y+yoffset开始的位置(缩放问题不考虑),然后原来的X+=xadvance,然后再画下一个字符,遇到换行符Y+=lingHeight。
在cocos2d-x中使用位图字体的更多相关文章
- NGUI-制作位图字体以及图文混排
制作字体过程 首先得下载一个位图制作工具Bitmap font generator,可以点击这里下载 1.新建txt文件,输入字体里面包含的文字 2.保存为utf-8格式:点击文件另存为,选择编码格式 ...
- 【咸鱼教程】BitmapLabel位图字体使用
引擎版本3.2.6 教程目录一 为什么要使用位图字体二 如何使用位图字体2.1 TextureMerger制作位图字体2.2 exml中使用位图字体三 Demo源码 一 为什么要使用位图字体egre ...
- EUI组件之BitmapLabel 位图字体
一.制作文图字体文件 使用TextureMerger制作位图字体,具体查看 官方教程. 我们这里制作了一组位图字体. 二.导入位图字体 位图字体素材放入资源配置文件default.res.json 三 ...
- 使用Glyph Designer创建位图字体
使用Glyph Designer创建位图字体 转http://book.2cto.com/201210/6610.html <iOS 5 cocos2d游戏开发实战(第2版)>将引导 ...
- 详解利用ShoeBox制作位图字体
http://childhood.logdown.com/posts/190580/-details-using-shoebox-produce-bitmap-fonts?utm_source=tui ...
- 关于Unity中的NGUI字体
NGUI字体类型 1: UIFont字体,UIFont类实现的2: TTF动态字体的使用3: BBCode的特殊字体的使用4: NGUI字体制作5: BMFont字体制作和艺术字体的制作6: UILa ...
- Laya 位图字体制作(失败...)
参考: 官网教程-位图字体的制作与使用 一.下载字体并安装字体 从站长字体下载了液晶数字字体,将TTF文件拖入C盘windows/Font文件夹,则字体会自动安装 二.下载字体制作工具 Bitmap ...
- [译]GLUT教程 - 位图字体
Lighthouse3d.com >> GLUT Tutorial >> Fonts >> Bitmap Fonts 位图字体一般是二维字体.虽然我们会把它放到三维 ...
- SQLSERVER中NULL位图的作用
SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Da ...
随机推荐
- WPF 3D 小小小小引擎 - ·WPF 3D变换应用
原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用 WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开 ...
- Android include的使用
如果在程序中多次用到一部分相同的布局,可以先将这部分布局定义为一个单独的XML,然后在需要的地方通过<include>引入,如下: main.xml <?xml version=&q ...
- Android-锁屏功能
当屏幕多久没有点击的时候,进行某种操作就是所谓的锁屏功能. onCreate: public void addRunnable() { handler.postDelayed(runnable, Co ...
- hdu4432 Sum of divisors(数论)
Sum of divisors Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4009 不定根最小树形图
讲一下建图过程,首先建立一个超级源点S,对于这个源点,向每个HOUSE连一条有向边,权值为该HOUSE建立WELL的费用,即高度*X. 然后每个可以连边的WELL之间,费用为曼哈顿距离*Y,然后考虑两 ...
- Item Import: What Does "Sync" Items Do? (Doc ID 417887.1)
In this Document Goal Solution APPLIES TO: Oracle Item Master - Version 11.5.10.0 to 11.5.10.0 [Rele ...
- Android开发之PendingIntent的使用
PendingIntent,待确定的意图,等待的意图 官网链接:http://developer.android.com/reference/android/app/PendingIntent.htm ...
- C#中的try catch finally
try中的程序块是有可能发生错误的程序块,catch中的程序块是当发生错误的时候才会执行的代码块,finally中的程序块是无论是否发生错误都会执行的代码块. 示例程序: ? 1 2 3 4 5 6 ...
- BrnShop开源网上商城第一讲:架构设计
首先在此感谢大家对BrnShop项目的支持和鼓励!我们在发布BrnShop以前曾推测项目会受到不少园友的支持,但没想到园友们的支持大大超过我们的预测.4天6000次浏览,140个推荐,170个评论,8 ...
- ZOJ3261 Connections in Galaxy War 并查集
分析:对于这种删边操作,我们通常可以先读进来,然后转化离线进行倒着加边 #include <stdio.h> #include <string.h> #include < ...