使用图集工具 TexturePacker 自定义模板及如何自定义 BMFont类型的模板

如题,据我们的大神伟哥所说,我们在后面的开发中有可能会用到一个工具,需求是能够根据游戏原画所出的单个文字的图在游戏中能够方便的使用, 即跟调用 BMFont类型的字体一样。但是为什么要用原画出的图片,直接使用 BMFont不就好了,。。。当然是因为原画出的图肯定要比 BMFont 中的字体要好看啊。。。

废话不多说,看下面实现。。。

仔细的看 BMFont 的文件格式:

复制代码
info face="HiraKakuStdN-W8" size=64 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=2,2
common lineHeight=96 base=56 scaleW=256 scaleH=128 pages=1 packed=0
page id=0 file="example-2.fnt.png"
chars count=3
char id=24230 x=2 y=2 width=66 height=66 xoffset=1 yoffset=-1 xadvance=64 page=0 chnl=0 letter="度"
char id=29702 x=70 y=2 width=66 height=62 xoffset=1 yoffset=2 xadvance=64 page=0 chnl=0 letter="理"
char id=32 x=138 y=2 width=0 height=0 xoffset=21 yoffset=76 xadvance=21 page=0 chnl=0 letter="space"
复制代码

个人觉得对应关系是:

face--字体名称,

size-- 字体大小,

scaleW-- 生成的图片宽度,

scaleH-- 生成的图片高度,

pages-- 生成的图片页数,

file -- 生成的图片名称,

count -- 文字的个数,

char id -- 单个文字对应的 Unicode码,

x , y -- 文字的坐标,x y轴为图片的左上角,

width , height -- 文字在图片上所占的宽高,

xadvance -- 文字未被处理的宽度,

letter -- 文字字符,

除 xoffset, yoffset 不能理解,但是用猜测的方法填写的之外,其余的都是使用的 原fnt文件未被修改的值。。。

想到打包图片到一起,根据配置文件 fnt来寻找文字的位置,实际就是使用一种自定义的图集,而正好 TexturePacker支持自定义 format 格式的功能。。。

下面以使用最新版的 TP v3.5.3 为例,因为我之前用的 破解版的 TP中缺少一个库文件(grantlee_defaulttags)的引用,导致所有使用 js扩展的 format都不能使用,而恰好咱们要写的这个需要用到 js扩展来计算一些东西,故 此处被坑,找了很长时间的原因,而新版的 v3.5.3则没有这个坑。。。

首先,在桌面新建目录群 my-TP-Exporters,格式如下

(其中的.svn不需要),然后打开 TP,使用自定义模式,然后在 TP的 preferences设置自定义目录为刚才咱们创建的 my-TP-Exporters,

别忘了设置玩路径点下面的 ok!!!

在上面的目录群中分别创建了三个文件:BMFont_custom.fnt(模板)、exporter.xml(TP配置文件)、makecssselector.qs(js扩展)

首先贴出 exporter.xml 的内容:

复制代码
 1 <exporter version="1.0">
 2     <!-- identifier of the exporter -->
 3     <name>BMFont_custom</name>
 4 
 5     <!-- display name of the exporter for the combo box -->
 6     <!-- 此处更改的是在 TexturePacker 中显示的 format 类型 -->
 7     <displayName>BMFont (custom)</displayName>
 8     
 9     <!-- description of the exporter -->
10     <!-- 此处的是这个 format 的简要说明 -->
11     <description>Exporter for BMFont, created by Yun</description>
12 
13     <!-- exporter version -->
14     <!-- 此次更改的版本 -->
15     <version>1.0</version>
16     
17     <!-- currently only one file allowed - more to come with update -->
18     <!-- 下面改的是生成的文件的后缀名信息,和生成的 format 参照模板 -->
19     <files>
20         <file>
21             <!-- name of this file variable -->
22             <name>fnt</name>
23 
24             <!-- human readable name (for GUI) -->
25             <displayName>fnt</displayName>
26 
27             <!-- file extension for the file -->
28             <fileExtension>fnt</fileExtension>
29 
30             <!-- name of the template file -->
31             <!-- 参照模板, 必须要和本文件处在同一目录下 -->
32             <template>BMFont_custom.fnt</template>
33         </file>
34     </files>
35 
36     <!-- target framework supports trimming -->
37     <supportsTrimming>true</supportsTrimming>
38 
39     <!-- target framework supports rotated sprites -->
40     <supportsRotation>false</supportsRotation>
41 
42     <!-- rotated sprites direction (cw/ccw) -->
43     <rotationDirection>cw</rotationDirection>
44 
45     <!-- supports npot sizes -->
46     <supportsNPOT>true</supportsNPOT>
47 
48     <!-- supports file name stripping (remove .png etc) -->
49     <supportsTrimSpriteNames>yes</supportsTrimSpriteNames>
50 
51     <!-- supports texure subpath -->
52     <supportsTextureSubPath>yes</supportsTextureSubPath>
53 
54 </exporter>
复制代码

再贴出根据上面的 .fnt文件 修改的模板 BMFont_custom.fnt

复制代码
info face="custom-Yun" size=64 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=2,2
common lineHeight=96 base=56 scaleW={{texture.size.width}} scaleH={{texture.size.height}} pages=1 packed=0 {% load makecssselector %}
page id=0 file="{{texture.fullName}}"
chars count={{allSprites|getArrayLength}} {% for sprite in allSprites %}
char id={{sprite.trimmedName|getUnicode}} x={{sprite.frameRect.x}} y={{sprite.frameRect.y}} width={{sprite.frameRect.width}} height={{sprite.frameRect.height}} xoffset={{sprite.sourceRect.x}} yoffset={{sprite.sourceRect.y}} xadvance={{sprite.untrimmedSize.width}} page=0 chnl=0 letter="{{sprite.trimmedName|makecssselector}}"{% endfor %}
复制代码

最后是 在上面的BMFont_custom.fnt 中用到的 一些 javascript 函数的扩展文件 makecssselector.qs

复制代码
 1 // create a css selector by replacing -hover with :hover
 2 var MakeSelectorFilter = function(input)
 3 {
 4   var input = input.rawString();
 5   return input.replace("-hover",":hover");
 6 };
 7 // create name in BMFont_custom.fnt to invoke
 8 MakeSelectorFilter.filterName = "makecssselector";
 9 // add the function to TexturePacker Library
10 Library.addFilter("MakeSelectorFilter");
11 
12 // return the length of array
13 var GetArrayLength = function(input) {
14     return input.length.toString()
15 };
16 GetArrayLength.filterName = "getArrayLength";
17 Library.addFilter("GetArrayLength");
18 
19 // return the Unicode for input char
20 var GetUnicode = function(input) {
21     input=MakeSelectorFilter(input)
22     return input.charCodeAt(0).toString()
23 };
24 GetUnicode.filterName = "getUnicode";
25 Library.addFilter("GetUnicode");
复制代码

上面 所有用到的TP的 API 参照其官网 https://www.codeandweb.com/texturepacker/documentation#customization

额,还有 一些本来我是不会的 javascript脚本 现查现用的 http://www.w3school.com.cn/js/index.asp

 

下面测试一下成果,

文字图片:

使用 TP自定义 format 打包:

生成图集:

下面在 cocos2dx 工程中的使用效果:

 

注意:

不知道大家注意到了没有,上面生成的图集文字中有个别的红色的文字,这是由于使用的未破解的 TP,用未破解的 TP来自定义format时, 生成的图集会有个别红色的图片,

 

怎么办呢,版本低的没有可以成功使用的库,版本高的没有破解的,头疼。。。

在这个网址我试着 跟 TP的开发作者申请了一个免费的 license key, 目前正在等待中。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: TexturePacker是一个强大的工具,用于制作和编辑图像的精灵表或图集,这使得游戏开发者可以有效地管理和提高游戏的性能。TexturePacker还提供了一种方便的方法,通过拆分图集,将大型图像资源分解为更小的部件,以便在游戏中更好地使用。 拆分图集可以通过多种方式实现,其中一个流行的方法是使用TexturePacker的命令行选项。通过使用命令行选项,可以自动化拆分图集的过程,并根据需要生成多个子图像资源。这对于大型游戏项目特别有用,因为游戏需要处理大量的图像资源,而拆分图集可以大大减少应用程序的加载和处理时间。 使用TexturePacker进行图集拆分时,可以选择多种拆分选项。例如,可以将图像资源按行或列分割,在固定的边框或网格上分割,或使用自定义切割边框。这意味着开发者可以完全控制拆分过程,以确保生成最优化的子图像资源。 总之,TexturePacker图集拆分功能提供了一种完全可定制的方法,以在游戏中轻松管理和加载大量图像资源。它不仅可以提高游戏的性能和加载速度,还可以减轻开发者的负担,使其更专注于游戏的核心功能。 ### 回答2: TexturePacker是一款常用的纹理打包工具,可以将多个小图合并成一张图集进行优化,提高游戏或应用的性能和加载速度。而拆分图集则是将一个大的图集按照指定的规则进行切分,分离出多张小的图集使用TexturePacker拆分图集可以使得游戏或应用更加灵活,可以根据场景需要加载不同的图集,减少资源浪费。同时也可以方便地进行图集的维护和优化,提高整个项目的可维护性和效率。 拆分图集的方法有多种,可以按照文件名、大小、引用次数等规则进行切分。在TexturePacker工具中,可以通过选择“多文件输出”来实现拆分图集功能,选择合适的规则进行配置即可。在导出图集时,生成多张小的图集,每张图集包含指定的纹理,可以根据需要分别加载。 需要注意的是,拆分图集虽然提高了灵活性和可维护性,但也会增加文件数量和加载次数,可能会影响到游戏或应用的性能。因此在使用时需要根据实际情况进行权衡和优化。 ### 回答3: TexturePacker是一个非常方便的工具,它可以将多张图片合并成一个大的图集,以提高游戏或应用程序的性能和加载速度。但是,当图集非常大时,可能会导致内存占用过高或加载速度变慢。在这种情况下,可以使用TexturePacker的拆分功能,将大图集拆分成多个小图集。 拆分图集的步骤非常简单。首先打开TexturePacker,选择要拆分的图集并点击“Split”按钮。然后,选择一个合适的输出目录和文件名前缀,并定义拆分的数量和方式。可以按像素大小或图像数量拆分,并设置间隙和边距。最后,单击“Publish”按钮,TexturePacker会根据你的设置自动拆分图集并生成多个小图集。 拆分后,你的代码需要进行相应的更改,以便正确加载拆分后的图集。在访问图集时,你应该使用一个列表或数组,并遍历所有拆分的图集,并将它们合并成一个最终的纹理。这可以通过loadTextures方法或类似方法实现,其中,你需要指定分别加载每个小图集的路径和文件名,并将它们组合成一个单个的纹理开发包。 总之,使用TexturePacker拆分图集是提高游戏或应用程序性能和加载速度的好方法。虽然拆分后的图集需要一些额外的代码来加载和管理,但这可以保证你的应用程序在运行时更有效率并降低内存占用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值