冒险解谜游戏中文网 ChinaAVG

标题: [转贴] GF汉化详细教程[游戏字体篇] [打印本页]

作者: shane007    时间: 2008-10-6 10:37
标题: [转贴] GF汉化详细教程[游戏字体篇]
现在的游戏大部分是用矢量字体了,但以前的游戏一般都是用点阵字体。下面先介绍一下点阵字体显示原理。 ' B# o2 D$ `$ u
1 _3 H5 \" G- @- E4 i" Q! n
汉字内码 3 f4 F4 c! j! n6 e8 U1 p% l
  点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。
' s2 Q" l9 ]7 S4 v  d+ _* U. Y" R8 Q: M. e
汉字字模
8 G: G) y- [5 A* u  得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的: " [. n' J+ c) ?: r3 N$ `& i
; D7 y) [) g: f( x2 d5 T

( S4 G/ [% N4 F8 R! _$ s6 d5 J. a7 F" t9 D" T! a# J  z

# O- z0 {6 q' z' _0 j而中文的“你”在字模中却是这样记载的:
% a* |2 J+ m4 i( t* I  5 b, c  D' D/ \1 I

5 [, @) A3 U/ i% l
& x5 O2 Q  K2 ]% Y4 |( R# Z
  A0 T# {  h* H& N/ e: g所有的汉字字模组成点阵字库,像以前Dos下常用的Ucdos汉字系统就是用的点阵字库,点阵字库根据不同需要有好多种尺寸,如16*16 24*24,点越多显示的字越细致,特别是显示那些笔划比较多的字,效果越好。 + O; f4 `# |; `* a: @4 v% S

" n4 g6 B( |: X4 K4 Y/ h下面进入GF字体的世界,GF的字体扩展名是.LAF,都打包存储于Data000.LAB文件中。先分析一下LAF的文件格式,然后再讨论如何在字库中加入中文。LAF格式由文件头、字体索引表、字体偏移量表、字体点阵四部分组成。 & J/ r6 \$ c8 t

. r5 S! e8 D$ _+ R8 l' O1.  文件头(32字节) ' |% K+ ^1 h3 a+ a& J; y# `
5 k. ]( B' i/ |% d2 u
字段 . j) u- D) N( t2 M/ {
数据长度 / k: D8 D+ F. e( X) G+ K  P
描述
0 U6 a# ?$ b" z. Z- Z5 S 8 G4 e; [" E5 H0 u$ S( [& `
Charnum
8 \: s- }7 b; c6 _# @1 @' U- U8 Q Long(4字节)
- j! T; y& ^. [$ M% c2 C 字库中字体个数
1 {( ]. d; n; s& H3 ^
( Y* Y1 M; t) _3 [' pfontsize
1 ?+ e/ {# x% s& h Long(4字节) / d% q7 q* e0 s7 Y2 S% s- }& t# k+ u
字体点阵部分的数据长度
5 x) o5 Z' G1 S* J/ Y5 t 5 r: k4 F, d2 t1 Y
MaxWidth 9 U1 g. b& P* U! X  v& l
Long(4字节)
. a9 t! V/ W3 g 字体最大宽度 / g% i" q* w0 k9 h) k( L
% T4 u- i* O7 ?
MaxHeight
& a5 L) U1 J6 U Long(4字节)
( x" k% R1 W! L  c. U 字体最大高度 . O/ Y6 ^* }3 p7 }. d
$ k/ t0 g* L. r, H8 i0 S$ u  N6 E  u
Unknown ( ^" E$ ^$ B. `
Long(8字节) 9 E# W& J) h6 N- R$ L8 ^
未知 1 K1 w: c% K. q1 P  h

9 G. e" Z1 [0 g4 o9 a8 NFirstChar
$ b& m, W6 o0 f: I2 |7 X1 t Long(4字节)
# ]9 ]2 c3 t+ S; {5 o  ^ 第一个字符编码 ! t/ R- w) ?( w+ k0 E1 K# f& J

  l+ {0 b: u: XLastChar
# z0 \# ]( I; v! W Long(4字节) + T# s8 e- H8 z2 O- T8 z
最后一个字符编码
* x5 L! s+ |& w% [; c7 L- D 4 Z9 B1 ^: g3 F* w) \
9 Z" H, V8 M% N/ d
    u# |- i9 ?9 {3 Q- V$ Y8 l7 {" h
" m" Y8 D# e. ]4 `; k. j4 E0 o
2.  字体索引表
- v! d# h9 _, |! a
, ?: Y& `. r3 F7 j与字体编码范围相对应,每个双字节保存一个字模在偏移量表中的偏移量。如GF的英文字库是显示ASCII码表中0-FF的字符,所以有256个字模,字体索引表有256*2 =512字节。保存内容为这256个字模在字体偏移量表中的偏移量 * j6 \2 J1 R" c# }4 N. ~+ p2 E0 P8 G! j

7 C# O  |# T6 ?: O$ k3.  字体偏移量表(与字体个数一一对应)
" y# Y( [  u8 I+ s$ R" [, l3 w1 K4 p8 I* p) n2 z& H* J# r7 ?
字段 6 S  R& D0 f( X2 [6 B+ R5 D1 ?
数据长度 # G6 D( g8 j/ J0 [+ r6 F. ^) z
描述 7 I$ R) N! @4 V, A  n

, `- K! I# h% S6 r7 A3 UOffset 2 r- l# Q3 T# [+ M! m. }
Long(4字节) & y( R9 m. W5 M6 w) I- a& n
此字模相对字体点阵的偏移量
( \2 ?. B9 F# ?" w
. Y  D, q9 k- z5 EUnknown
! i3 N0 t2 ]1 _- c Long(4字节)
: |+ P, @( t; C: { 未知
! Z9 f7 E4 f" T9 o3 D; E) _ : `# e& Q/ @- J; i
Width
; }' y# `$ R& a3 [( @$ q8 w% }% | Long(4字节)
/ _  n, e# C' r4 F  }8 ? 字模宽度
; M  T2 }; }  ]$ V3 _! m
0 N4 ?' `' Y+ P3 ]. t, v# L4 \Height
0 y( D4 P1 \0 Q7 b2 ? Long(4字节) : p0 J1 q3 J7 ~/ A) ?; w
字模高度
5 Z5 n2 [" r, L( [0 m- z) P 3 T. z( S' M: A9 U

$ p% I* n+ A+ |, m; S  
) i# w0 S( s* U0 ~$ P$ I2 E( h" q- W4 ]3 m: ~3 z# Q- i; j: M
4.  字体点阵
! ]3 ^1 L9 ^4 C9 X: w7 X
1 s! G: d" y7 O1 r% Z! L保存字体点阵。字体点阵的保存顺序是,从左到右,从上到下。0代表无点,ff代表有点。(这是GF点阵与一般字体点阵的区别,一般字体点阵一个二进制位的1代表一个点,但是GF的字库0xFF才代表一个点)。 5 \! g0 t. C0 p1 y, ?2 J1 p
  Q, A0 A( N3 L* l9 P7 M" r' l
现在举一个GF中的点阵的例子,下图是GF中汉字“选”的点阵,可以基本看出字形吧,每个汉字都要做成这样的点阵加入到字库中去。
) t& s, @" |" x  W8 G! _5 V" k/ R2 a% h# T0 x
. f+ P/ B  C' k( k' W4 P5 N1 x1 T
  
) D* _, b  B# O1 A: S/ Y  N' ]
; u+ d) M" y5 @2 i6 k2 b现在举一个例子,说明GF程序如何显示一个英文字母N。(N的ASCII码是0x4E) 7 v. w  w, K, Q7 Y) H7 ^$ n
7 }! ~: W" N+ z/ q5 [
1.  在字体索引表中找到字模在偏移量表中的偏移量。读文件32+4E*2 = 0xBC处的双字,得到偏移量4E。 3 h# B% @7 V# M* }3 B* h1 R$ Y# R4 t4 g
( \/ C# u! P% F: a& J( m
2.  在字体偏移量表中得到字体点阵的偏移量。读文件32+512+4E*16 = 0x700处得到字体点阵的偏移量0x17c0,再读0x708h得到字体N的宽0x0A,再读0x70ch处得到字体N的高0x0C。
8 p- ?( S6 A( I1 b  v' X+ `: j! d
/ q& Y9 k+ I3 C2 N4 j' x, G" E, F0 _3.  读字体点阵显示字符N。字体点阵的首地址为16*256+512+32 = 0x1220H。字体N的点阵部分是在文件0x1220H+0x17c0H到0x1220H+0x17c0H+0D*0A之间。 * w- I1 z; I/ i) G2 Q6 U  x! W0 Z

, a; {+ U4 ^( P* ?  4 i1 ?$ d2 Y' W. ?' X( h
9 t+ @: f! a" C- ^6 P5 P
汉字编码GB2312-80简介 ; C1 V% X1 p% F/ E- G

4 W$ k* O6 R3 D& n$ F3 @2 f$ X/ PGB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
! |3 A" w/ L# V# V- X$ _& K1 ?  }& T" l, P6 `6 z
  GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。
# U1 D- b. ?$ t) M& O6 b; J0 }, I2 [: r/ M, R- ]4 c
  GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。
* _% b% A+ v1 A' ?3 O$ M( B8 C/ U2 c- I$ `' a- T
GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。
& T3 W8 ]0 V) _8 |
$ D8 Z2 n+ U* `9 V5 I5 E' Y6 P改造字库
2 b0 B2 T$ ~" m. T. |' X' B4 X! @7 ]: f" B% z( \9 `) E) R* y9 n7 r
我们现在要做的就是将GB2312中的6763个汉字加入到GF的字库中去。汉字点阵定为16*16。因为游戏中仍要部分内容要以英文方式显示,所以我们加入汉字并不应该破坏原有的英文点阵字库,而是应该在英文字库尾部追加这6763个汉字。 . q( r! f2 G) m* D) W; Z( d0 P

8 A3 P3 \7 R: J7 U5 n) W9 Z/ U1.  首先要修改文件头部分,每个字段都要做相应调整。
$ n1 ~+ }# t5 o" O- G( H2 G% @  x- a- q; m0 ~
2.  由于汉字编码范围是2121H-777EH,所以字体索引表至少要扩大为777E*2个字节。索引表的内容前512字节为原始的英文字体索引表,应该保留。在此之后,凡遇到字体索引表中GB2312汉字编码处是汉字的位置,添加汉字在字体偏移量表中的偏移量。汉字偏移量应该从0x100开始(前256是英文字库)
* F5 u- ~) C2 l% x3 ^$ ]8 O9 F% I9 m0 `5 B- ?: L, g3 ^5 `7 H
3.  重建字体偏移量表,将6763个汉字在字体点阵的偏移量、汉字宽0x10,汉字高0x10写入。 ( {  E# r  p8 W. C9 M6 {% s

9 G$ v4 Q2 w% ?: I# h6 t  K1 G4.  将6763个汉字的点阵追加到原来英文点阵的尾部。 " g+ U4 Z0 C/ V" ~0 V; p

6 a( b3 A4 p3 ~% U( q! g6 F经过以上4部,字库改造完毕。虽然修改只有4部分,但是每部分都涉及到各种偏移量的计算,多字节高低位的读取等、文件头的再修改等步骤,代码实现起来非常麻烦,稍有不甚就会失败,甚至导致GF运行时直接崩溃,调试时需要特别的耐心才行。
/ y3 r9 h# A$ q2 d; `7 j5 o1 q4 l
    在生成新的字库后,把新字库覆盖掉原来Data000.LAB中的同名字库文件,字库的修改就大功告成了。
作者: firendless    时间: 2009-3-17 16:53
不需要考虑高低位问题,程序自己会搞定,比如储存65534[&hFFFE] 用程序来做会自动储存为FE FF




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