Torque2D MIT 学习笔记(27) ---- ImageFont的使用以及字体ImageAsset的工具生成
前言
ImageFont继承于SceneObject,是一个场景对象,支持例如旋转,缩放,移动加速度以及物理碰撞等一切Torque中场景对象的一切功能.
ImageFont只支持ASCII编码表中的32-127这么96个字符,字符的表现是通过一个ImageAsset文件配合一个对应的PNG图片来完成的.
ImageAsset中的帧序列与32-Char的结果对应,从而完成渲染.
问题
目前主流的字体生成器都没有支持Torque的格式导出,所以想自己做一款字体就比较麻烦.当然你可以去找图,毕竟原理上面已经说了,只要满足就可以.
这里我说一种使用BitmapFont工具来生成,然后通过TorqueScript写的工具来做一次转换得到相应的Taml资产格式.
步骤
BitMapFont
免费软件,下载直接使用.
勾选32-126的字符:

选择字体和导出选项:


保存文件并拷贝到Torque执行文件目录,比如生成的文件叫做: testFont.fnt testFont_0.png
脚本实现
// 转换
function BMFontToImageAsset( %fnt_file, %asset_file, %asset_name, %asset_image )
{
// 文件读取
%document = new SimXMLDocument();
if( !%document.loadFile( %fnt_file ) )
{
echo( "BMFontToImageAsset.Failed.BadFntFile:" SPC %fnt_file );
return false;
} // 节点寻找失败 if( !%document.pushFirstChildElement("font") )
{
echo( "BMFontToImageAsset.Failed.BadFntFile:" SPC %fnt_file );
return false;
} // 节点寻找失败
if( !%document.pushFirstChildElement("chars") )
{
echo( "BMFontToImageAsset.Failed.BadFntFile:" SPC %fnt_file );
return false;
} // 节点寻找失败
if( !%document.pushFirstChildElement("char") )
{
echo( "BMFontToImageAsset.Failed.BadFntFile:" SPC %fnt_file );
return false;
} %savexml = new SimXMLDocument();
%savexml.pushNewElement( "ImageAsset" );
%savexml.setAttribute( "AssetName", %asset_name );
%savexml.setAttribute( "ImageFile", %asset_image );
%savexml.pushNewElement( "ImageAsset.Cells" ); // 循环查找32-127之间的ASCII字符信息
while( true )
{
%id = %document.attribute("id"); // 不合法跳过
if( %id < 32 || %id >= 127 )
{
echo( "BMFontToImageAsset.Failed.InvalidChar:" SPC %fnt_file );
continue;
} // 属性取得
%x = %document.attribute("x");
%y = %document.attribute("y");
%width = %document.attribute("width");
%height = %document.attribute("height");
echo( "Char: x=" @ %x SPC "y=" @ %y SPC "width=" @ %width SPC "height=" @ %height ); %savexml.pushNewElement( "Cell" );
%savexml.setAttribute( "Offset", %x SPC %y );
%savexml.setAttribute( "Width", %width );
%savexml.setAttribute( "Height", %height );
%savexml.popElement(); // 寻找下个字符
if( !%document.nextSiblingElement("char") )
break;
} // FNT文件关闭
%document.clear();
%document.delete(); // FNT中的字符数量应该是32-126,95个,不够96个字符,如果不够ImageFont是无法创建的.
%savexml.pushNewElement( "Cell" );
%savexml.setAttribute( "Offset", "1 1" );
%savexml.setAttribute( "Width", 1 );
%savexml.setAttribute( "Height", 1 ); // ImageAsset格式文件保存
%savexml.popElement();
%savexml.saveFile( %asset_file );
%savexml.delete(); return true;
}
格式转换
在控制台中输入: BMFontToImageAsset( "testFont.fnt", "FontConsolas48.asset.taml", "FontConsolas48", "FontConsolas48.png" )
会在同级目录生成FontConsolas48.asset.taml文件,PNG自己改名字就可以了
至于ImageFont的具体使用,参考自带的字体Toy即可,这里不再多说.
结语
BMFont的导出格式中还有很多的参数,有兴趣的朋友可以继续研究.再见~
Torque2D MIT 学习笔记(27) ---- ImageFont的使用以及字体ImageAsset的工具生成的更多相关文章
- [原创]java WEB学习笔记27:深入理解面向接口编程
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Linux下汇编语言学习笔记27 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- Kali学习笔记27:Burpsuite(上)
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 如果我只能选择一款工具进行Web渗透,那么一定就是Bu ...
- PHP全栈学习笔记27
数组概述,类型,声明,遍历,输出,获取数组中最后一个元素,删除重复数组,获取数组中指定元素的键值,排序,将数组中的元素合成字符串. 数组概述,数组是存储,管理和操作一组变量. 数组类型为一维数组,二维 ...
- 量化投资学习笔记27——《Python机器学习应用》课程笔记01
北京理工大学在线课程: http://www.icourse163.org/course/BIT-1001872001 机器学习分类 监督学习 无监督学习 半监督学习 强化学习 深度学习 Scikit ...
- C++学习笔记27:异常处理机制
一.异常处理机制基础 异常的定义 程序中可以检测的运行不正常的情况 异常处理的基本流程 某段程序代码在执行操作时发生特殊情况,引发一个特定的异常 另一段程序代码捕获该异常并处理它 二.异常的引发 th ...
- CUBRID学习笔记 27 数据类型4
范围比较 数字和字符串比较 字符串被转为double SELECT i FROM t WHERE i <= all {'11','12'}; i ============= 1 2 3 4 字符 ...
- android学习笔记27——Activity
Activity配置==> android应用程序要求所有的应用程序组件都需要进行显示配置后,才可正常使用.包括:Activity.Service.BroadCastReceiver.Conte ...
随机推荐
- 继续(3n+1)猜想
卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候, ...
- latch:cache buffers chains的优化思路
数据块在buffer cache存放是以linked list方式存放的.当一个session想要访问/修改buffer cache的block,首先需要通过hash算法检查该block是否存在于bu ...
- CSS 组合选择符
CSS 组合选择符 组合选择符说明了两个选择器直接的关系. CSS组合选择符包括各种简单选择符的组合方式. 在 CSS3 中包含了四种组合方式: 后代选取器(以空格分隔) 子元素选择器(以大于号分隔) ...
- Constructor and destructor -- Initialization & Cleanup in C++
Why need initialization and cleanup? A large segment of C bugs occur when the programmer forgets to ...
- Java Runtime Data Area
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个区域,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖着用户的线程的启动和结束而建 ...
- Javascript 中 call 的两种用法
用法一(常见用法): 表现形式为:一个对象.方法.call(另一个对象),意义是用另一个对象代替当前对象,执行当前对象的方法.先看示例: function Class1(){ this.name = ...
- wordpress4.0.1源码学习和摘录--项目设置
1.静态变量日期 define( 'MINUTE_IN_SECONDS', 60 ); define( 'HOUR_IN_SECONDS', 60 * MINUTE_IN_SECONDS ); def ...
- JavaScript学习心得(六)
函数 对函数参数没有任何类型检查(弱类型),在必要时在函数内加上类型检查(typeof): JavaScript的函数参数无法设置默认值(可以通过检查参数,当为undefined时设置一个值 func ...
- 【pyhton】短路逻辑
编程语言常用的逻辑if a and b:#如果a是false,那么跳过b的判断,结果直接falseif a or b:#如果a为true,那么跳过b的判断,直接true
- Maven工程的Web调试
1.添加Server,将Web工程和Tomcat关联起来: 1)Windows->Show views->Other-->Servers,将会在下方弹出Server的窗口,然后右键添 ...