设为首页收藏本站官方微博

【大型图片字库AVG汉化第1弹】ANKH 主菜单图片字库的制作

[复制链接]
查看: 5640|回复: 27
打印 上一主题 下一主题

【大型图片字库AVG汉化第1弹】ANKH 主菜单图片字库的制作

跳转到指定楼层
楼主
发表于 2009-6-6 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【大型图片字库AVG汉化第1弹】ANKH 主菜单图片字库的制作

这些天我一直在想一种比较简便的制作任意字体大小图片字库的方法。 , x/ o  F3 g3 t  A: f) H1 P/ Y
注意,是任意字体大小,不是任意图片大小。
1 D  ^; D+ n6 F3 l下面简单说一下方法。 % E" ~! x! _+ d' ?
3 T9 y8 x& N5 _/ N% H7 _& H
首先我们用一个制作点阵字库的工具制作一个点阵字库,字体的高度和宽度可以任意设定,不过我们一般来说设为相等的。 ( Q# l. ?) U, l, s- A
具体的高度和宽度我们可以参考原来的字体,找一个差不多的高度和宽度就可以了. 6 i; D1 C0 d! A# F6 O5 z. D
接下去我们可以这么做 8 Y1 K6 u; _* B6 s9 x' l, v" W

8 q1 ^/ C" F" m3 H1.用任意点阵字库制作工具制作字库 + S9 E' h/ O3 g) \" n# R; X7 t
  由于是工具根据TTF字库制作出来的点阵字体,所以字体的大小一致是有保证的。
- x3 _! K  m! ]任意点阵字库制作工具如下 4 p# }- I+ F- R. [6 N
https://www.chinaavg.com/read.php?tid=17138 9 P3 O0 X* k0 f" K) r9 J! Y2 k
任意点阵字库查看工具如下 ) \. z. J5 L% l
https://www.chinaavg.com/read.php?tid=16610 ' {5 d$ G) L1 w: i  X
2 Z) T8 Z4 Z& ?. b' Q+ Z8 Q" M) |
2.准备好我们需要的汉字 4 f- [8 l) g8 a" I8 K  ?, n
  用工具制作出来的字库是包含了所有的汉字,所以我们需要先把我们需要汉化的字幕翻译好,整理出其中不重复的汉字。 ( J# g2 E( M, u

/ c( K/ s/ S; |7 u+ _- L3.在tga中写入我们需要的汉字
) m9 c( o( H( U
  有了我们需要的不重复的汉字列表,还有一个全汉字版的点阵字库,我们就可以进行汉字抽出和变换工作了。 ; i+ g6 c5 f& h4 D/ t* w
  首先我们要解释一下这个任意点阵字库制作工具生成的字库的格式,这个工具是采用字节对齐方式来生成字库的。
0 M+ q( x4 }# Z% J3 z. A$ ?  什么叫字节对齐?
: r6 x  B+ W' D' G& A  比方说,一个字节有8个bit,可以表示8个点的状态,那么16X16的点阵字库一行像素需要16位也就是2个字节来表示。一个汉字就需要32个字节来表示。那么如果我们的汉字是17X17的呢?1行用2个字节就不够了,1行最后那个点虽然只需要用一个位来表示,但是也占用了一个字节,
: q/ `+ j  o  E4 m
/ c$ V# A5 T5 c) \# H这就叫字节对齐。所以17X17的汉字需要17X3=51个字节来表示。
4 r. d& d9 ]0 n5 _) e6 y  ' f$ C' n$ {& Y
  好,理解了这些。我们可以找到一个汉字在字库中的字模并且取出字模了。
* G  ?- K7 m0 K" t: }  光取出字模还不够,我们还要把它变换为我们需要的tga图片字库文件。 - r- P+ ?! N2 F9 I( A% K; A0 Q
  字模是用一个字节中的一个bit来表示一个点(我忘了是用0还是1来表示有点了,假设是1)。 3 ~& N) J) m2 H# p" b; o0 y" ~  E
  而tga图片是用FF FF FF FF 来表示一个有色点,FF FF FF 00来表示一个透明点。
2 p* o. J/ s/ Y: Z2 u  我们要做的是把字模中的1转换为tga图片中的有色点,把字模中的0转换为tga图片中的透明点。
& ]* N1 Z  B+ F
2 G1 O; G1 ?) j  |+ IGB索引代码如下
: w/ N1 ], G% R. l- fidx = ((idx % 256) - 0xa1)* 94  + ((idx / 256) - 0xa1);
% k! E' [, K& O9 N6 n( |5 a! ]6 E. \- `
4.XML
& }9 k9 G0 D; p' \; S! x  把字库tga文件生成好以后还要生成配套的XML文件。
3 P; ]3 [/ _( ], k- |. L  这个应该比较好理解,我就不多作解释了。 4 X$ N  T8 a5 B; G
  根据字体的高度和宽度以及在tga中的位置来生成就行了。+ r& M0 c  @) `

; O; ]5 I# Q+ U- {------------------------------------------) `  }% Y1 s) M) ?) Q
2009.6.7 更新
7 G1 n& z6 J  H) T' y5 {, o我再补充一下,我们还需要做2件事。* H- z2 l7 o0 i' F: \0 h: d) C

: l" G7 e2 p3 s7 l' _5 [- @6 k6 [1.生成码表
( J6 Y* m9 f2 W# X& A$ N  码表就是中文字符和xml中定义的ascii码的对应表。具体的格式可以自由定义,只要我们自己编的程序能够识别就行了。
: Q6 X" q2 S, C2.转换生成菜单字幕文件
) v1 u2 t4 t; [   菜单字幕文件的原始内容是一个ID对应一个英文字符串5 d  X6 T! R7 e8 h" l* d% {9 z) |
   我们要先把它转换成一个ID对应一个中文字符串,然后到码表中寻找每个中文字符对应的ASCII码,再把它写回到菜单字幕文件文件中即告完成主菜单的全部汉化工作。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

沙发
发表于 2009-6-7 19:31 | 只看该作者
前三步应该不难,甚至可以合并到一个工具里来实现。也就是从TXT中提取汉字,整理不重复的以后,直接生成TGA文件。6 w7 n9 \, N* F" F0 w* c
至于第四步,我还没有研究过游戏的XML结构。不好下结论。但想来是XML结构应该不会太难。
( M" R: X: ^5 k% E- F因为下载的两个游戏都在单位的电脑上,我明天一早就出差走,可能没有时间去研究了。那就凭我现在的理解说两个问题,可能两个问题一旦搞明白XML文件以后就不是问题了,但还是希望007能给我解释一下,这样我在出差的时候就能够把程序的主题框架构思出来,解决一些算法上的问题,出差一回来就可以动手了。
$ t" e, J# m" X8 S7 I1 C- ]9 I) l: f( w  T" |# q& `& i! ?
问题1:我们汉化的游戏中的英文和数字怎么处理?仍然调用原来的字体TGA文件吗?
- h- b# }, j* u( W+ D* }问题2:假设我们汉化制作好以后的TGA中按顺序保存了如下汉字“一二三四”,而在需要显示的对话中,一句是“一三”,另一句是“一四”。
% o( U2 G* |% A3 B5 M那么在XML中,是不是应该有这样的结构:8 c$ ^4 e9 ^( g7 z  X) g, l) ?
{$ F  C1 i! K$ F7 [0 C$ D: y
SHOWTEXT  //需要显示文字的ID,或者是偏移量2 V/ A2 V) z9 S$ B" @
X  // 显示的X坐标
2 R# x* b6 A; ~. |5 cY  // Y坐标
# y8 n" o8 z. y. g& \}2 f( P/ d# H$ y) t" r
当然,如果这个结构中再包含字体文件,那就解释了我的第一个问题。如果是这样,那又出现一个新问题,就是制作汉化的XML时,需要考虑英文或者数字的宽度,将后面的文字显示位置进行调整。
# l2 E2 i: N( B! q! d; l! w. h& Z6 m' H  K: n8 Q
“一三”对应的XML内容就是{TGA名, ID:1, X:100, Y: 100;TGA名, ID:3, X:116, Y: 100}  //假设显示在(100,100)  X0 D2 N' l5 _# s9 u
“一四”对应的XML内容就是{TGA名, ID:1, X:200, Y: 100;TGA名, ID:4, X:216, Y: 100}  //假设显示在(200,100)" [& F2 n$ z; g: W8 D

' b4 M  P; t; v/ o% p猜测,以上都是我的猜测,请007发一个游戏中XML的样式我看一下。
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2009-6-7 20:16 | 只看该作者
我先回答你的第一个问题 ' p" [4 p9 g( S8 K6 x
对于主菜单以外的字幕,字幕的内容其实是任意的,我们只要能识别出ID,字幕随便我们写。 2 ]( h( s& Q2 m8 U
你应该是问主菜单的英文和数字对吧。这也不难,中文字库里有英文和数字的,把中文字库里的英文和数字当成中文字符一样转换成tga中的一部分就行了。 1 y( k: \- k. ^" \' M
只不过索引算法有点不同,你用工具看一下中文字库中的英文和数字的位置应该可以知道了。
4 d/ J5 V  J, Q7 w: D; P还有个笨办法,把10个数字和26个字母一个一个从中文字库切出来,要哪个就往图片上画哪个就行了。
: B# F) Z1 H* X6 M/ |5 Y3 S1 R. E, c# ?* q
我先把xml放上来。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2009-6-7 20:35 | 只看该作者
<Image Name="32" XPos="0" YPos="0" Width="1" Height="0" XOffset="0" YOffset="36" />- @/ ^, M: f8 y9 J
  <Image Name="33" XPos="299" YPos="171" Width="11" Height="29" XOffset="-2" YOffset="4" />! V9 e/ a9 e% i  U/ V. U
6 d' E1 H6 i: o) q1 `
看来你又理解错了。& d) b9 Z+ l( c; j: |, A4 v6 j
看一下上面的定义,其实很好理解,XPos,YPos应该是字符的左上角那个点,Width,Height是字符的宽度和高度,XOffset,YOffset是显示时候的修正量。xml的一行对应一个字符,如果是中文的话,由于宽高相等,这个xml的值是很有规律的。
9 r; a) j" Q$ q: j
) u$ I2 S- V# VXML对应的是一种字体。- \" B2 t, L" o* `
所以没有你认为的“一三”对应的XML内容就是。。。“一四”对应的XML内容是。。。之说。. J0 d: z; z' c# @# e
“一三”,“一四”是定义在主菜单的字幕文件Interface_english.bin里,然后程序会在tga和xml中寻找“一”,“三”,“四”,并把它们显示出来。就是说在tga和xml中没有重复的内容,否则就不能称之为字库了。
回复 支持 反对

使用道具 举报

5#
发表于 2009-6-7 20:53 | 只看该作者
似乎这类的都可以动手了?
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2009-6-7 20:58 | 只看该作者
引用第4楼firendless于2009-06-07 20:53发表的  :
: e1 \2 N3 t( _, F7 L' F似乎这类的都可以动手了?

, B2 N' R6 p" q/ e应该是的。! J8 M3 O* k0 V
不过proxy dll 内部的识别部分我还没什么把握,我对vc也不太熟,但是研究一下应该可以搞出来。
5 M+ p9 T1 h& x/ {! E8 a- \# P我的这个新技术有很大的通用性的。8 Q9 ~8 ^% T  e8 e
不过也有局限性,字幕画面太复杂的不行。像日记,对话记录之类的东西可能会有问题。
. k8 b' F0 T# c, pankh搞定之后,我想研究一下字幕随鼠标位置变化的游戏。
回复 支持 反对

使用道具 举报

7#
发表于 2009-6-7 21:12 | 只看该作者
看来我对游戏XML还是没有理解,我猜测的跟实际的相差很多。9 J% {  y+ ]' ]$ ?5 k: w8 i
你发的文件我研究了一下,.font.xml, .imageset.xml,.TGA文件,这三个是一组。在imageset文件里,规定了字符要从TGA文件中读取,TGA文件的宽度和高度也都定义了。而且每个字符的左上角坐标以及宽度高度定义出来。我注意到,这里的定义是按照ASCII码的顺序定义的,比如A就是65。然后.font文件里把ASCII码(Codepoint)和图片编号对应上。这里又出现了一个问题:
# `' f4 f1 x5 k/ _因为是ASCII码,所以理论上能处理的最多是255个字符。这就要求我们汉化的这些东西不能超过255个不同的汉字+英文+数字+字符,也许对于主菜单来说,做到这个并不是很困难。
2 W& w' s0 O8 L; p3 |+ {于是,我的猜测是这样,假设我们整理出来的汉字是这样“一二三四”,并且已经在TGA文件里设计好了,然后我们在imageset里定义他们的图片,分别分配编号128,129,130,131,然后在字幕文件Interface_english.bin里,需要显示“一”的地方用ASC(128)代替,“二”的地方用ASC(129)代替。只所以这样,是考虑有英文字母数字等情况,所以128以前的保留。那就只剩下127个汉字可以显示了。
: @+ x# r0 z- ]: B& j2 U1 E" D那就需要做两种考虑,一种是汉字数小于127的,按我上面的理解;另一种是汉字数大于127, 那就需要把前面的某些用不到的字符去掉,相当于全部打乱重新排列了。
% b7 U" k0 G# [# K. @8 K如果我上面的理解没有大的错误的话,程序应该很简单了。但是我现在想不明白的是,为什么在TGA文件里,每个字母的排列不是按照顺序的?好像很杂乱,又好像是为了节省地方特意安排的。而且最大的图片尺寸是512*512,如果我们需要显示汉字的话,1024*1024甚至更大的TGA图片能行吗?
回复 支持 反对

使用道具 举报

8#
 楼主| 发表于 2009-6-7 21:14 | 只看该作者
2009.6.7 更新
回复 支持 反对

使用道具 举报

9#
发表于 2009-6-7 21:30 | 只看该作者
随鼠标其实也很简单的,几乎都是rect,无外乎椭圆以及矩阵的焦点~hook获取就可以了..代理果然好,幸亏之前有预习C\\C++~哇哈哈
回复 支持 反对

使用道具 举报

10#
 楼主| 发表于 2009-6-7 21:33 | 只看该作者
肥牛,你的理解又进了一步。不过还有问题。
8 ^- `( u9 k8 e0 z. T. otga图片里面的字符数量的限制,其实只是ascii码的限制。最多放0-255共256个字符。3 g+ q8 `- m7 O4 Y
在图片里只保存我们要的字符,即使要英文字母数字,也不需要把所有的英文字母数字都保存到tga中。同理,也只把我们要用到的中文字符保存到tga图片里面。- b" q0 x* r$ _
理解了这个道理的话,就知道256个字符足够了。5 ~3 B' O5 v$ Z5 |
上面说了,tga图片里面的字符数量的限制,和图片的大小是无关的。3 Z. L2 t- E% a3 @: c

6 A/ ~+ B2 m4 U( r/ v2 j+ }在TGA文件里,每个字母的排列不是按照顺序的?好像很杂乱。3 y/ h  E' e* G2 s5 U3 w) ^# A
这的确是为了省地方,对我们汉化来说,没什么意义,不用照着它做。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表