冒险解谜游戏中文网 ChinaAVG

标题: 【大型图片字库AVG汉化第1弹】ANKH 主菜单图片字库的制作 [打印本页]

作者: shane007    时间: 2009-6-6 14:43
标题: 【大型图片字库AVG汉化第1弹】ANKH 主菜单图片字库的制作
这些天我一直在想一种比较简便的制作任意字体大小图片字库的方法。
7 n/ e2 g0 j1 i. M: _) O# D, e注意,是任意字体大小,不是任意图片大小。
  v# a% S' v; c' `* H- x下面简单说一下方法。
. A% B9 I/ R$ l0 k; `/ W  E! i0 _, c6 }0 R: _
首先我们用一个制作点阵字库的工具制作一个点阵字库,字体的高度和宽度可以任意设定,不过我们一般来说设为相等的。 4 _3 E  f9 c+ F; D
具体的高度和宽度我们可以参考原来的字体,找一个差不多的高度和宽度就可以了.
* _* M; O0 @8 x接下去我们可以这么做 4 B/ T7 o% Y+ @8 z  S

4 g* f3 Z4 c1 ^- Z6 N. k- X1.用任意点阵字库制作工具制作字库
$ T9 }0 ]  C0 {/ f" L% z
  由于是工具根据TTF字库制作出来的点阵字体,所以字体的大小一致是有保证的。 6 k. u# J( p/ q: q7 \
任意点阵字库制作工具如下 : S( Y! n% b& L$ P( Y; z) f
https://www.chinaavg.com/read.php?tid=17138 ) d. @& O7 \8 j5 I, g1 N6 D3 K" b
任意点阵字库查看工具如下
+ p( r' ~3 j  G, k0 B9 b- V' Thttps://www.chinaavg.com/read.php?tid=16610 5 \% ^# M. M! ~6 @

+ L5 X4 i* D% c# L) N2.准备好我们需要的汉字 2 G' {9 Y% ^+ O" m' ]  R1 {
  用工具制作出来的字库是包含了所有的汉字,所以我们需要先把我们需要汉化的字幕翻译好,整理出其中不重复的汉字。
$ N) Q. ~& [" s# _7 F. f
# l" j! w$ T2 c3.在tga中写入我们需要的汉字
% V# Z. Z7 y! k5 l; K
  有了我们需要的不重复的汉字列表,还有一个全汉字版的点阵字库,我们就可以进行汉字抽出和变换工作了。 2 U% I3 X; }7 @  n; W. G9 x4 P
  首先我们要解释一下这个任意点阵字库制作工具生成的字库的格式,这个工具是采用字节对齐方式来生成字库的。 3 T" X' Z5 }% N
  什么叫字节对齐? , N* N8 j- j$ o) R# k: j/ }& D/ P
  比方说,一个字节有8个bit,可以表示8个点的状态,那么16X16的点阵字库一行像素需要16位也就是2个字节来表示。一个汉字就需要32个字节来表示。那么如果我们的汉字是17X17的呢?1行用2个字节就不够了,1行最后那个点虽然只需要用一个位来表示,但是也占用了一个字节, 4 e  V5 w  m& d8 \

1 ]4 X( o# T( E9 a( e2 w8 D这就叫字节对齐。所以17X17的汉字需要17X3=51个字节来表示。
. ?7 D. z8 a7 o( B* O" f  
( ~$ ^1 L1 R0 }  好,理解了这些。我们可以找到一个汉字在字库中的字模并且取出字模了。 , c& U+ R2 D: \* `
  光取出字模还不够,我们还要把它变换为我们需要的tga图片字库文件。
# }- W- `$ ?& U3 _/ R! w  字模是用一个字节中的一个bit来表示一个点(我忘了是用0还是1来表示有点了,假设是1)。
% Y2 s7 @7 p: N2 }, \: T: ~  而tga图片是用FF FF FF FF 来表示一个有色点,FF FF FF 00来表示一个透明点。 3 h: b% B. @* A7 Y# s$ v4 J! Y3 z
  我们要做的是把字模中的1转换为tga图片中的有色点,把字模中的0转换为tga图片中的透明点。 * }7 T! T1 i/ }! w+ O" m; [( B

% H- [9 t* [- [. r" }$ pGB索引代码如下 : J& {+ I  d9 `% G" U; |
idx = ((idx % 256) - 0xa1)* 94  + ((idx / 256) - 0xa1); 7 p8 w. K& q% X) c$ r" @& J
$ [3 X( v2 U0 Q4 d9 {* C9 O6 Q% D
4.XML
; `* X3 [) x# ?3 r' n8 Y  把字库tga文件生成好以后还要生成配套的XML文件。
/ Z" n0 W; u: Z- H  这个应该比较好理解,我就不多作解释了。
9 q8 c/ q' K* Z4 X, O  根据字体的高度和宽度以及在tga中的位置来生成就行了。
  a; j, M$ n: ~. @: n3 m
5 `) k! ^/ h! f$ [9 j+ Y------------------------------------------5 s  N+ }- x( G
2009.6.7 更新% t5 I* d# C$ l6 ^- ~$ N# u7 H
我再补充一下,我们还需要做2件事。
( g5 I- H. k6 V2 l# o: |/ `/ g* l) }' N/ H! y' o
1.生成码表
9 J/ Z- J) e4 _6 c& e6 |5 c* `! N  码表就是中文字符和xml中定义的ascii码的对应表。具体的格式可以自由定义,只要我们自己编的程序能够识别就行了。; O4 F- j8 R$ n$ s
2.转换生成菜单字幕文件
2 {/ Z! v$ A7 L% J) n4 f6 N   菜单字幕文件的原始内容是一个ID对应一个英文字符串
1 i$ I1 y3 C7 ~9 @9 y( I# r' H5 W, Y   我们要先把它转换成一个ID对应一个中文字符串,然后到码表中寻找每个中文字符对应的ASCII码,再把它写回到菜单字幕文件文件中即告完成主菜单的全部汉化工作。
作者: 肥牛    时间: 2009-6-7 19:31
前三步应该不难,甚至可以合并到一个工具里来实现。也就是从TXT中提取汉字,整理不重复的以后,直接生成TGA文件。
$ _" z& s; O0 d至于第四步,我还没有研究过游戏的XML结构。不好下结论。但想来是XML结构应该不会太难。
& J7 a: T: |+ \9 L$ r* P" j5 F1 k! C% o因为下载的两个游戏都在单位的电脑上,我明天一早就出差走,可能没有时间去研究了。那就凭我现在的理解说两个问题,可能两个问题一旦搞明白XML文件以后就不是问题了,但还是希望007能给我解释一下,这样我在出差的时候就能够把程序的主题框架构思出来,解决一些算法上的问题,出差一回来就可以动手了。
+ v9 ~0 v$ s  |0 a5 N8 O* H1 p4 ]& |) q! x$ T2 y
问题1:我们汉化的游戏中的英文和数字怎么处理?仍然调用原来的字体TGA文件吗?' s. i( q  t. v8 U! i. o- s+ ~
问题2:假设我们汉化制作好以后的TGA中按顺序保存了如下汉字“一二三四”,而在需要显示的对话中,一句是“一三”,另一句是“一四”。  s3 P3 ~3 @( V  [$ ~3 u( e' }
那么在XML中,是不是应该有这样的结构:9 @# r  ?! Y% ~
{0 X' `$ S+ w6 x0 u
SHOWTEXT  //需要显示文字的ID,或者是偏移量; `0 m# A( z% x) \9 X
X  // 显示的X坐标
$ p% b, M& s' w4 V+ A9 L4 L7 bY  // Y坐标+ d- v! y* H+ |: F8 R# k
}( L5 c2 A- r1 o' J5 X
当然,如果这个结构中再包含字体文件,那就解释了我的第一个问题。如果是这样,那又出现一个新问题,就是制作汉化的XML时,需要考虑英文或者数字的宽度,将后面的文字显示位置进行调整。
1 {2 ^( ~0 W' q: s6 A, x( _" L( ]/ V" x% R5 m" f2 {7 t
“一三”对应的XML内容就是{TGA名, ID:1, X:100, Y: 100;TGA名, ID:3, X:116, Y: 100}  //假设显示在(100,100)3 k& c: T/ Z. Q( Z/ L) E$ L( ~
“一四”对应的XML内容就是{TGA名, ID:1, X:200, Y: 100;TGA名, ID:4, X:216, Y: 100}  //假设显示在(200,100)) S/ y7 @5 t' }- G% @7 f

( a! k5 S" u/ g  U4 o猜测,以上都是我的猜测,请007发一个游戏中XML的样式我看一下。
作者: shane007    时间: 2009-6-7 20:16
我先回答你的第一个问题
& V4 L- c8 h9 ~: q# I, `对于主菜单以外的字幕,字幕的内容其实是任意的,我们只要能识别出ID,字幕随便我们写。
4 f1 ], X, w1 f9 @5 @! [你应该是问主菜单的英文和数字对吧。这也不难,中文字库里有英文和数字的,把中文字库里的英文和数字当成中文字符一样转换成tga中的一部分就行了。 : Q. l8 c& W& Z
只不过索引算法有点不同,你用工具看一下中文字库中的英文和数字的位置应该可以知道了。 4 G9 u6 g' C) E: w6 R
还有个笨办法,把10个数字和26个字母一个一个从中文字库切出来,要哪个就往图片上画哪个就行了。 ' f" A# Z( R9 s( `; _

, Y. z; J- n* x8 V: E6 M  o" U3 R我先把xml放上来。
作者: shane007    时间: 2009-6-7 20:35
<Image Name="32" XPos="0" YPos="0" Width="1" Height="0" XOffset="0" YOffset="36" />6 k  A" i' b) K! r4 h
  <Image Name="33" XPos="299" YPos="171" Width="11" Height="29" XOffset="-2" YOffset="4" />
  h1 T% ^) \1 t& @; }; I; P. T' ~0 u0 _% ]' A4 f
看来你又理解错了。4 F4 T* ?/ X4 J4 b2 W
看一下上面的定义,其实很好理解,XPos,YPos应该是字符的左上角那个点,Width,Height是字符的宽度和高度,XOffset,YOffset是显示时候的修正量。xml的一行对应一个字符,如果是中文的话,由于宽高相等,这个xml的值是很有规律的。
( l; ?8 Y+ N. {
; B; ~" q% Q- A: GXML对应的是一种字体。6 t8 k3 H4 G; B; e5 o6 ]1 ~
所以没有你认为的“一三”对应的XML内容就是。。。“一四”对应的XML内容是。。。之说。7 q) v8 [6 Q" N0 `# @9 |3 X5 I
“一三”,“一四”是定义在主菜单的字幕文件Interface_english.bin里,然后程序会在tga和xml中寻找“一”,“三”,“四”,并把它们显示出来。就是说在tga和xml中没有重复的内容,否则就不能称之为字库了。
作者: firendless    时间: 2009-6-7 20:53
似乎这类的都可以动手了?
作者: shane007    时间: 2009-6-7 20:58
引用第4楼firendless于2009-06-07 20:53发表的  :1 j0 o. l/ z+ g- r1 m
似乎这类的都可以动手了?
9 v( p* \0 j& l4 P+ Z3 p
应该是的。
9 S3 C3 C( g+ c4 c& x: ]不过proxy dll 内部的识别部分我还没什么把握,我对vc也不太熟,但是研究一下应该可以搞出来。% p2 L  _3 y# A, L: U
我的这个新技术有很大的通用性的。
0 \% a8 [$ c1 D+ H2 h+ E不过也有局限性,字幕画面太复杂的不行。像日记,对话记录之类的东西可能会有问题。
: {0 ?: s5 W4 u) kankh搞定之后,我想研究一下字幕随鼠标位置变化的游戏。
作者: 肥牛    时间: 2009-6-7 21:12
看来我对游戏XML还是没有理解,我猜测的跟实际的相差很多。0 Y( L3 X0 H7 ]! r2 {
你发的文件我研究了一下,.font.xml, .imageset.xml,.TGA文件,这三个是一组。在imageset文件里,规定了字符要从TGA文件中读取,TGA文件的宽度和高度也都定义了。而且每个字符的左上角坐标以及宽度高度定义出来。我注意到,这里的定义是按照ASCII码的顺序定义的,比如A就是65。然后.font文件里把ASCII码(Codepoint)和图片编号对应上。这里又出现了一个问题:( v# Y' F8 t0 X6 u9 T
因为是ASCII码,所以理论上能处理的最多是255个字符。这就要求我们汉化的这些东西不能超过255个不同的汉字+英文+数字+字符,也许对于主菜单来说,做到这个并不是很困难。
; R9 Q: G3 P- n# _于是,我的猜测是这样,假设我们整理出来的汉字是这样“一二三四”,并且已经在TGA文件里设计好了,然后我们在imageset里定义他们的图片,分别分配编号128,129,130,131,然后在字幕文件Interface_english.bin里,需要显示“一”的地方用ASC(128)代替,“二”的地方用ASC(129)代替。只所以这样,是考虑有英文字母数字等情况,所以128以前的保留。那就只剩下127个汉字可以显示了。' s/ c, Q, Z9 u) _7 S% k. T/ r" j% R
那就需要做两种考虑,一种是汉字数小于127的,按我上面的理解;另一种是汉字数大于127, 那就需要把前面的某些用不到的字符去掉,相当于全部打乱重新排列了。8 Y: N( U0 |% t9 {# O. h  {
如果我上面的理解没有大的错误的话,程序应该很简单了。但是我现在想不明白的是,为什么在TGA文件里,每个字母的排列不是按照顺序的?好像很杂乱,又好像是为了节省地方特意安排的。而且最大的图片尺寸是512*512,如果我们需要显示汉字的话,1024*1024甚至更大的TGA图片能行吗?
作者: shane007    时间: 2009-6-7 21:14
2009.6.7 更新
作者: firendless    时间: 2009-6-7 21:30
随鼠标其实也很简单的,几乎都是rect,无外乎椭圆以及矩阵的焦点~hook获取就可以了..代理果然好,幸亏之前有预习C\\C++~哇哈哈
作者: shane007    时间: 2009-6-7 21:33
肥牛,你的理解又进了一步。不过还有问题。
: K3 `" _0 a. J' I: O" Z4 ?0 Atga图片里面的字符数量的限制,其实只是ascii码的限制。最多放0-255共256个字符。
% U  N4 z  F& ~7 j在图片里只保存我们要的字符,即使要英文字母数字,也不需要把所有的英文字母数字都保存到tga中。同理,也只把我们要用到的中文字符保存到tga图片里面。
  S% `, [1 `" Z& s# F# h理解了这个道理的话,就知道256个字符足够了。
: `2 O5 J( f6 w$ A+ n上面说了,tga图片里面的字符数量的限制,和图片的大小是无关的。
7 q" x4 B$ P/ K2 M1 F0 D! r% O8 ?
在TGA文件里,每个字母的排列不是按照顺序的?好像很杂乱。
1 e8 k5 B* u- c  \4 N这的确是为了省地方,对我们汉化来说,没什么意义,不用照着它做。
作者: shane007    时间: 2009-6-7 21:35
引用第8楼firendless于2009-06-07 21:30发表的  :
2 U, W6 [0 |! y6 T- ?* @随鼠标其实也很简单的,几乎都是rect,无外乎椭圆以及矩阵的焦点~hook获取就可以了..代理果然好,幸亏之前有预习CC++~哇哈哈

8 g: P& C4 }2 y$ d9 s7 g鼠标坐标应该可以获得,关键是推算对话框的位置计算公式。
作者: 肥牛    时间: 2009-6-7 21:47
说到这里,我就明白了。工具可以制作了,包括对码表。在一个工具里就可以完成了。
% J7 V' z4 K9 q8 `+ c' _
! u% I, U! N! E  w) x( E$ D这个任务我先不接了,这一个星期我都在北京出差,没法做。谁能做就先做吧。如果我回来以后还没有人做的话我再做。
作者: shane007    时间: 2009-6-7 21:53
引用第11楼肥牛于2009-06-07 21:47发表的  :# P1 @* @0 b, r( B* R, x( }
说到这里,我就明白了。工具可以制作了,包括对码表。在一个工具里就可以完成了。, Y' H9 |# g$ r3 K; T& m* }# r& p

; s/ ]1 c' T' a1 f" ?这个任务我先不接了,这一个星期我都在北京出差,没法做。谁能做就先做吧。如果我回来以后还没有人做的话我再做。

3 {+ u  y8 @( M* p, u; IOK, 明白。估计下周出现其他人接手的可能性并不大。
作者: habit    时间: 2009-6-8 15:18
这游戏是ogre和cegui做的,这两个东东都是开源的。而且有做游戏的前人已经搞过了在这上面显示汉字的方法(可能需要修改引擎重新编译)。借鉴一下的话有可能会事半功倍。
作者: shane007    时间: 2009-6-8 17:15
引用第13楼habit于2009-06-08 15:18发表的  :
7 u% _* V2 d; q9 ]! M+ x这游戏是ogre和cegui做的,这两个东东都是开源的。而且有做游戏的前人已经搞过了在这上面显示汉字的方法(可能需要修改引擎重新编译)。借鉴一下的话有可能会事半功倍。

+ p* Z' V( @6 O" D这个思路我也早就有了,只是实现起来不太容易喔。1 i, d, L! D! C! [! m
在DLL里取到字符串容易,然后如何向屏幕画呢,要取surface?
( K! T8 ^; c1 h5 p7 I7 G- J% {有时间的话你可以在这方面研究一下。
作者: habit    时间: 2009-6-9 08:04
如果修改引擎的话就不需要额外的DLL另外向屏幕画了,而是直接修改源码使引擎直接支持中文显示和中文字体。如果有熟悉这个引擎的游戏开发人员最好了。
作者: soring123    时间: 2009-6-9 09:15
这不大可能有的吧 除非引擎是开源的
作者: shane007    时间: 2009-6-9 11:15
引用第15楼habit于2009-06-09 08:04发表的  :! Y* S; K3 I4 z4 C
如果修改引擎的话就不需要额外的DLL另外向屏幕画了,而是直接修改源码使引擎直接支持中文显示和中文字体。如果有熟悉这个引擎的游戏开发人员最好了。
$ y4 [5 q# B0 Q6 B' X
这个思路完全正确,只是短时期内实现不了,暂时没有熟悉cegui的人。
作者: shane007    时间: 2009-6-9 11:16
引用第16楼soring123于2009-06-09 09:15发表的  :, a1 H6 L* T' ~6 Z; l+ ]8 h( S9 r* A# F
这不大可能有的吧 除非引擎是开源的
9 V$ n! b$ a4 C4 Y5 f% T
制作ankh界面的cegui的确是开源的。
作者: soring123    时间: 2009-6-9 11:35
http://blog.csdn.net/bluekane/archive/2009/01/09/3738581.aspx
, Z' H3 o" W# |6 t: h! g有用吗?
作者: shane007    时间: 2009-6-9 11:49
引用第19楼soring123于2009-06-09 11:35发表的  :
" B0 W1 \) K' \* e  V  Y' d" khttp://blog.csdn.net/bluekane/archive/2009/01/09/3738581.aspx
+ l5 h( V2 p) C& r有用吗?
# W& O* _- {% F2 i
怎么说呢,可以作为参考。& P' P, r7 _# B; t2 @# h1 K! e0 t
CEGUI虽然是开源的,但是游戏的主exe文件并不开源,所以我感觉仅修改CEGUI的部分无法实现汉化。这只是我目前的想法,以后有新思路也说不定。
" R5 ~  E6 E7 I, e# s4 {$ \参考资料是越多越好,多谢了!
作者: 慕容枫叶    时间: 2009-6-9 12:46
http://www.cppblog.com/d3d/archive/2007/10/05/33558.html9 l2 n% C, X6 w/ ?9 m# }

$ M6 ?, j+ X: s/ W( ~; X这个也是显示中文的方法。。。: E. ?1 j9 O) J) [8 k+ H

0 T1 x& L; Q8 T, j; @' w先作为参考吧~~
作者: shane007    时间: 2009-6-9 19:00
谢谢!
作者: 肥牛    时间: 2009-6-15 08:51
我出差回来了,看了上面大家的回复,好像有更方便的解决办法了?我想知道这个工具还需要做吗?
作者: 慕容枫叶    时间: 2009-6-15 10:30
当然需要做工具啊~
2 z( M' s( J# D+ `% _& r! F; Z目前没有熟悉cegui的人才,加上游戏菜单部分没有开源,这方面实现比较困难
作者: shane007    时间: 2009-6-15 11:18
引用第23楼肥牛于2009-06-15 08:51发表的  :7 S$ U7 Z$ `" n: D
我出差回来了,看了上面大家的回复,好像有更方便的解决办法了?我想知道这个工具还需要做吗?
/ M6 K# _) J" _- K! C+ `  L3 w
工具还是要做的,不过我又有了新的想法。3 E$ N% X% {2 q# k! L0 q
可以进一步简化,也许2维码可以不用了,只用条形码。# v- @& X& O0 U2 j3 V
我等会更新。
作者: shane007    时间: 2009-6-15 11:39
请见更新9 H7 ]4 v9 h0 M1 X8 A/ h9 v- }* t
https://www.chinaavg.com/read.php?tid=17405
作者: 妖妖梦    时间: 2009-8-25 05:20
全中文字库  这个我是从祖玛官方中文字库取来的




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2