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

[转贴] GF汉化详细教程[游戏字体篇]

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

[转贴] GF汉化详细教程[游戏字体篇]

跳转到指定楼层
楼主
发表于 2008-10-6 10:37 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

[转贴] GF汉化详细教程[游戏字体篇]

现在的游戏大部分是用矢量字体了,但以前的游戏一般都是用点阵字体。下面先介绍一下点阵字体显示原理。
3 v/ s% U2 L' B: O8 k9 f( @. R4 E
8 Z$ c! q0 m" g" Z8 S7 `汉字内码 " r: p" \7 A3 {, `  p
  点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 8 J, R) J# {0 }1 p$ e# ^
5 M  W/ n& O- E# `5 a- o& A
汉字字模
) h+ h, [1 y/ `+ J/ y  得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的: ! }! \. c- l$ K  h5 e( K

5 d5 O" p, h. n) ? 1 B- W0 \& Z; W  e7 Z: [+ A$ ?

9 ]& h" v6 p' j2 x, r% e' Z
% |- c, b7 c  N! V3 P而中文的“你”在字模中却是这样记载的:
% m: s) {" R# |6 n2 f- Z, g  
, g0 M: l/ @" ~* P; I) _
2 v0 J# S. p5 E1 [; H
0 {3 k& J0 W5 h1 K. c" T
# E* [0 |- Q$ r- A; z& z$ ]3 v; T所有的汉字字模组成点阵字库,像以前Dos下常用的Ucdos汉字系统就是用的点阵字库,点阵字库根据不同需要有好多种尺寸,如16*16 24*24,点越多显示的字越细致,特别是显示那些笔划比较多的字,效果越好。
" y9 A2 [9 T& @6 {5 a( ^
! V% T: R7 b  g9 ~下面进入GF字体的世界,GF的字体扩展名是.LAF,都打包存储于Data000.LAB文件中。先分析一下LAF的文件格式,然后再讨论如何在字库中加入中文。LAF格式由文件头、字体索引表、字体偏移量表、字体点阵四部分组成。
( i. n4 O6 U5 I% |- ^. V, j' V+ q, w$ a  V2 ?8 Y* b
1.  文件头(32字节)
5 |: B! M# I5 ?! f+ w% ~+ g9 J: e& ?1 u5 ~; R; H
字段 % }" E% X2 S' Z
数据长度
8 B. C& H+ M8 R 描述
. u2 V$ J0 r1 b& ?. X, W4 i
1 ~4 _  M4 v  _7 F7 TCharnum 2 v9 U+ U8 ^' H2 ^
Long(4字节) * N0 ?! S1 v! Q9 v6 z; Q( R
字库中字体个数
, M# x4 ]! Y5 g6 X
/ n* X" P, O+ P5 I" Nfontsize 4 x& N/ t( G; s+ ^3 ^+ |* A
Long(4字节) & ^% T# o& {% t1 {7 S
字体点阵部分的数据长度
$ T: l' m7 q9 K+ d% n- d
2 y7 s: V# @3 S5 B2 \  f0 o4 pMaxWidth & l/ L+ U/ R2 x% f
Long(4字节)   ~0 n0 F  O7 o( W
字体最大宽度 % o4 ~' w0 a/ x, ~+ c) M2 d. C
( n1 c+ q( n1 }
MaxHeight
  p; r9 J4 O0 l& H Long(4字节)
" w0 o; ]; T1 F  S 字体最大高度 " E5 l  A3 U2 Y8 j/ U# ~, J- q

( B3 ]2 c5 y3 O1 J. ^5 a5 RUnknown ( ?& ~, z  j! V1 _' Q2 z% ^
Long(8字节)   P5 V9 X9 J3 Y9 R4 ?  w
未知
" G* v( n' b4 y4 `& T* K" C* c 9 u9 P) ]/ Y' W' i7 z6 i
FirstChar
# m+ {& L" E+ q Long(4字节) ; \+ C) L5 X. O7 m) |. F
第一个字符编码 , o2 A- \2 S3 N9 F
: W, ?: ?& h# n
LastChar   i; ^- A( u8 N( @
Long(4字节)
  c1 Y3 d( _: j 最后一个字符编码 " O% B8 V2 a' j# J$ l
/ ]/ t( N5 {( q9 z1 }  U! |2 _

7 J' Z/ I0 V( F6 ]* V1 b+ A  
$ D: _0 [" w* D. {5 W1 D% b9 D% k/ _
2.  字体索引表
& M1 a. y8 _0 e" t8 e3 v
& X4 O4 \4 j) q' |* _. E0 U1 H0 h1 j7 E与字体编码范围相对应,每个双字节保存一个字模在偏移量表中的偏移量。如GF的英文字库是显示ASCII码表中0-FF的字符,所以有256个字模,字体索引表有256*2 =512字节。保存内容为这256个字模在字体偏移量表中的偏移量
8 V: o  s: ?: K1 H
% Q) v" j3 y, k! u" z1 w% |4 L" c& u3.  字体偏移量表(与字体个数一一对应)
5 F; O. e+ |1 c: q( m- {; ^
6 M' @7 a' `: [9 f  M5 O# G字段
, X+ s4 J7 o9 L# |! a* M4 P& G 数据长度 * @( \; a, j9 a
描述
2 r3 ?) k8 `' q6 f+ a % |9 H' N$ m3 w! l
Offset
% I8 c: G- K. G# U/ c, J& _ Long(4字节)
( k+ w$ a# ?7 W" f8 _1 F 此字模相对字体点阵的偏移量 ' f" K! \$ t0 y5 w7 Q$ R- D6 B
2 Q, M3 m$ k2 |1 ^
Unknown
# u1 \* a0 R* y5 ~, V) C* k Long(4字节)
$ ~0 Y4 }, `* ` 未知
' c2 F: K& _- x% Y6 n * I" m- q* j% p& _
Width
2 J2 O; l0 N' {) N4 }8 F$ }$ _ Long(4字节) $ w& r, \0 t* B
字模宽度
) {7 {% \2 ]# t, c7 N, |) H 9 E! ]1 f+ I# C
Height   n1 |% B- V6 I& E) `( N
Long(4字节) ; f! Y9 u+ b5 m# D( i( ^6 q, J
字模高度
- f7 ]- Y- |# g$ r9 s' G
# W+ D  o5 d) Q, X+ D1 z/ c& j! H1 E4 ^# q  u  O  u' H
  7 |7 S) M5 j1 H# |, Y$ F; v, ?
" U) r8 I. }2 r" v% I
4.  字体点阵
# {7 H  G7 ?, _4 U
+ e# b! D7 j/ x8 ?5 R$ K保存字体点阵。字体点阵的保存顺序是,从左到右,从上到下。0代表无点,ff代表有点。(这是GF点阵与一般字体点阵的区别,一般字体点阵一个二进制位的1代表一个点,但是GF的字库0xFF才代表一个点)。 , k1 v3 A0 a' D( A7 s
% ^4 z: A. E6 X) K' g3 m
现在举一个GF中的点阵的例子,下图是GF中汉字“选”的点阵,可以基本看出字形吧,每个汉字都要做成这样的点阵加入到字库中去。
! T5 B# u/ Q$ Y( `+ i- i! u6 Q* q3 M
4 |5 R7 G6 p) {9 G
  ! A# |3 b3 X9 H3 {' k0 e
1 D& i: F$ O) D. H
现在举一个例子,说明GF程序如何显示一个英文字母N。(N的ASCII码是0x4E)
, h& p2 C9 I% T* ~: K' k; I; ]: h- O6 ^1 H& ]
1.  在字体索引表中找到字模在偏移量表中的偏移量。读文件32+4E*2 = 0xBC处的双字,得到偏移量4E。 / v& _0 i, D( Z2 M
  _9 b* ~$ K3 V8 F8 R
2.  在字体偏移量表中得到字体点阵的偏移量。读文件32+512+4E*16 = 0x700处得到字体点阵的偏移量0x17c0,再读0x708h得到字体N的宽0x0A,再读0x70ch处得到字体N的高0x0C。 ' L7 _8 P* l) p' x" x$ I7 z: f* t! x
& o$ J  B+ l9 ~  b6 k5 W1 x
3.  读字体点阵显示字符N。字体点阵的首地址为16*256+512+32 = 0x1220H。字体N的点阵部分是在文件0x1220H+0x17c0H到0x1220H+0x17c0H+0D*0A之间。 ) m, Y/ y. O! B5 d& f
& g! }4 c+ ~( _
  & }  Y' i$ ]* T. e5 r+ m5 Q8 c
4 Y5 u% e2 i( b: l  C! j
汉字编码GB2312-80简介 0 `$ A4 K! B% R4 ?+ ]% r
6 k' S4 V' d( v4 n
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
/ m/ V( V" y6 v! }  k" H; @( b/ n2 R
  GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。
6 e4 _  z9 ?* l+ \* p; w4 ?* v& X0 b' z* y4 j1 [: [7 ?
  GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。 8 H, ^" W9 H- n% N

7 N% X2 D6 \9 f# W7 p; DGB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。
+ a' k7 J* r; p/ _4 }% G6 I% `! S7 V. b, u9 O
改造字库
( M& E0 \% _9 i+ k8 E* Z2 g7 _( j& o  t1 A* @
我们现在要做的就是将GB2312中的6763个汉字加入到GF的字库中去。汉字点阵定为16*16。因为游戏中仍要部分内容要以英文方式显示,所以我们加入汉字并不应该破坏原有的英文点阵字库,而是应该在英文字库尾部追加这6763个汉字。
# A' x" l9 ^- H& Q: }( g+ C# n! X# }8 t# C9 S
1.  首先要修改文件头部分,每个字段都要做相应调整。
; H5 `1 F# H! O/ w3 f# B
* z7 ]8 ~6 R; }; r2.  由于汉字编码范围是2121H-777EH,所以字体索引表至少要扩大为777E*2个字节。索引表的内容前512字节为原始的英文字体索引表,应该保留。在此之后,凡遇到字体索引表中GB2312汉字编码处是汉字的位置,添加汉字在字体偏移量表中的偏移量。汉字偏移量应该从0x100开始(前256是英文字库)
7 @/ G0 w& h  k' Y1 o8 i2 ~% t# g0 [( l) t
3.  重建字体偏移量表,将6763个汉字在字体点阵的偏移量、汉字宽0x10,汉字高0x10写入。
0 E( I1 z6 X& K
7 q% e5 W7 ]8 b% d- T4.  将6763个汉字的点阵追加到原来英文点阵的尾部。
3 }; q- v4 ]# n6 w7 V$ `$ k! R% B2 \5 K( p' ^+ Q, L
经过以上4部,字库改造完毕。虽然修改只有4部分,但是每部分都涉及到各种偏移量的计算,多字节高低位的读取等、文件头的再修改等步骤,代码实现起来非常麻烦,稍有不甚就会失败,甚至导致GF运行时直接崩溃,调试时需要特别的耐心才行。 ) c! K* f* g, x4 ]/ X
5 ~, H) I/ [3 [4 g/ e4 T% ^' L
    在生成新的字库后,把新字库覆盖掉原来Data000.LAB中的同名字库文件,字库的修改就大功告成了。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

沙发
发表于 2009-3-17 16:53 | 只看该作者
不需要考虑高低位问题,程序自己会搞定,比如储存65534[&hFFFE] 用程序来做会自动储存为FE FF
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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