冒险解谜游戏中文网 ChinaAVG
标题:
[转贴] GF汉化详细教程[游戏字体篇]
[打印本页]
作者:
shane007
时间:
2008-10-6 10:37
标题:
[转贴] GF汉化详细教程[游戏字体篇]
现在的游戏大部分是用矢量字体了,但以前的游戏一般都是用点阵字体。下面先介绍一下点阵字体显示原理。
0 m( [: |: `$ S* ]
/ i; Q: b4 \/ R; F( W
汉字内码
' d3 q; u8 a# G) M
点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。
+ j. j7 f4 w' L6 V( h7 C
1 N t$ l( r# o. t
汉字字模
# W2 f/ `* J9 I& N6 O, C
得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的:
. i6 B" M/ ]% |
% @4 {8 i% r5 i/ F% \& h
1 E$ c: e. U9 q4 ]5 D. R
: m W6 j! R+ s3 @" d
6 {$ X; d9 Z8 Z I( {: j( V
而中文的“你”在字模中却是这样记载的:
- d3 P! D8 N; j2 z# [
! o+ b8 r8 d6 J( T6 W1 u0 y/ W! \
: v3 C7 R; [- G
8 r( P+ p8 i: O& `, P
% \9 C. M# q( m9 \' V
所有的汉字字模组成点阵字库,像以前Dos下常用的Ucdos汉字系统就是用的点阵字库,点阵字库根据不同需要有好多种尺寸,如16*16 24*24,点越多显示的字越细致,特别是显示那些笔划比较多的字,效果越好。
: |; p8 ~" t6 b; u3 Y6 S7 u/ }! {
- R0 G1 T; H) f
下面进入GF字体的世界,GF的字体扩展名是.LAF,都打包存储于Data000.LAB文件中。先分析一下LAF的文件格式,然后再讨论如何在字库中加入中文。LAF格式由文件头、字体索引表、字体偏移量表、字体点阵四部分组成。
- N) A( S2 p& C# s
) K; [/ p0 Y7 U1 Q9 l# x+ k
1. 文件头(32字节)
4 H1 T$ T/ x: K2 w
+ ^& v. ?0 B2 p' t: L
字段
- C% Q1 Y4 u8 c! ?0 E: Y- j$ J+ s
数据长度
: P% w, N' R1 |2 g; ?# }0 Y
描述
) l* G. R1 p3 s. g& P) V; a) x( p
" T6 W( r/ M8 h" Z* M7 S: Z) P& G
Charnum
+ b7 v( }; _3 O* u0 x* n
Long(4字节)
/ d0 q$ T) @' x; p& d
字库中字体个数
" h8 D/ f k8 e) p
, @( r. Z+ c9 I0 Y" v
fontsize
/ y2 i8 X* a" P9 ] H7 T ~
Long(4字节)
( ?0 w% L2 T# K& a. j! n
字体点阵部分的数据长度
0 J$ e+ i: f+ j6 b. Y
* C# E3 G% Z- o* F$ [! D. O$ T
MaxWidth
0 \4 L, m# a: T1 k5 {. L8 i( S
Long(4字节)
0 m( y& u: g5 p8 P
字体最大宽度
+ b' L" g% O$ J, F0 A
! e# E. Z, J# ^ G
MaxHeight
* i8 m9 e: d8 M0 o8 l
Long(4字节)
4 m+ ?2 o2 ]$ M6 ^% F4 `
字体最大高度
3 ]! Q5 `8 T+ X
: g" e8 T* Y+ V( c; v' w
Unknown
3 ^8 e4 R: Q V5 r
Long(8字节)
- B% X% w) c% V' x) d9 P5 |/ H
未知
9 m5 a0 F' F* A n& Y8 `8 j
; _0 s. B' Y5 `7 g6 _% e! D2 Z9 q
FirstChar
& O4 y \& F, j7 F; T+ |6 S
Long(4字节)
f& {5 s" d( l9 T M/ s% x1 `) @
第一个字符编码
' r. A- [7 d. w! e! ~& X {
! y( B( [$ t$ D1 C8 Z* A
LastChar
" M# [2 a" p% {
Long(4字节)
/ H ]6 S" G# ^2 {, S7 U
最后一个字符编码
. p% U/ j8 _' O4 b0 P" K7 o
* c. X( C, l% d, c
; y) `* w0 L& s" ~! F7 k6 a
/ H; d6 E, s# C- o" B3 }* j
' z* j% b1 e0 f' @) o/ [- L
2. 字体索引表
8 q' z# W# E5 x, s
7 D+ L/ v- ~$ q: U
与字体编码范围相对应,每个双字节保存一个字模在偏移量表中的偏移量。如GF的英文字库是显示ASCII码表中0-FF的字符,所以有256个字模,字体索引表有256*2 =512字节。保存内容为这256个字模在字体偏移量表中的偏移量
! i" |" L* c/ O W
8 I3 E' D4 H7 ]0 H1 C
3. 字体偏移量表(与字体个数一一对应)
1 I/ b; k9 E, g/ e0 t4 S
& T* x" Q. B' ?+ Q
字段
$ L' X3 {5 B- W# K! D
数据长度
/ |# ]1 R0 t, F9 u, l4 P
描述
6 P1 o4 @/ [3 d3 r: u
4 a9 \5 Z0 R0 x( |/ y6 W) y Z
Offset
( X9 i/ {, }7 @& ^3 l, W
Long(4字节)
+ `0 A! H1 I* t f d
此字模相对字体点阵的偏移量
4 |' A( S9 ]3 c4 z
1 w0 U/ `* d: g5 A
Unknown
! C) H' s5 f3 d/ }/ R
Long(4字节)
+ ^: F! I4 o6 x R6 `) G+ Z0 Z
未知
; ]5 f F0 v4 H! l
6 T; P9 n6 H" N' }
Width
+ x; P' h* f( t
Long(4字节)
; n" ?1 }4 y* p$ i$ X" o
字模宽度
! N7 D8 v! m7 m( |+ d2 ~
+ A: J: u, }. ]: t1 j, H
Height
2 Q( l4 \& G+ w; t- y2 @
Long(4字节)
( y4 ?9 } \# \1 C1 F
字模高度
# ?. P6 M$ X; M2 Q
1 n8 ^' I5 c4 Q
2 m3 B; Q6 o o, H& h+ G& Y6 E
+ G2 U& _4 `! t( l
7 Y: ^$ @& X2 M, g8 C3 \
4. 字体点阵
! S7 {/ g7 u. C, H
R* x/ ^0 o; A( B
保存字体点阵。字体点阵的保存顺序是,从左到右,从上到下。0代表无点,ff代表有点。(这是GF点阵与一般字体点阵的区别,一般字体点阵一个二进制位的1代表一个点,但是GF的字库0xFF才代表一个点)。
8 X$ ^+ g3 X# O
7 q: x0 x, ?' j+ k. n l
现在举一个GF中的点阵的例子,下图是GF中汉字“选”的点阵,可以基本看出字形吧,每个汉字都要做成这样的点阵加入到字库中去。
! s: b# W% |* ~& j) |$ `0 ?
. E* L- v& m! e
* c9 u' u4 k9 Y, \& X. N' ?
2 ]4 q9 L+ U8 e
6 @1 D; j1 f: v
现在举一个例子,说明GF程序如何显示一个英文字母N。(N的ASCII码是0x4E)
" z8 S" o2 A5 g1 @. v. ~% M0 u, ^, t
- l( h) g* H4 E# `+ Y1 `: H
1. 在字体索引表中找到字模在偏移量表中的偏移量。读文件32+4E*2 = 0xBC处的双字,得到偏移量4E。
. p' Y. S. v7 l- V
4 }& Z% o- r7 L
2. 在字体偏移量表中得到字体点阵的偏移量。读文件32+512+4E*16 = 0x700处得到字体点阵的偏移量0x17c0,再读0x708h得到字体N的宽0x0A,再读0x70ch处得到字体N的高0x0C。
& W7 G) j) r# _; |: m7 i$ Z' h
! d" {; U( A0 L6 @
3. 读字体点阵显示字符N。字体点阵的首地址为16*256+512+32 = 0x1220H。字体N的点阵部分是在文件0x1220H+0x17c0H到0x1220H+0x17c0H+0D*0A之间。
5 \+ j0 R9 I6 u. D. X2 [% e v( U
8 e2 V" Z4 `# a8 W! m
( `) F' j- C5 X- W
& Q0 W0 a; N& D
汉字编码GB2312-80简介
' D' r% L) Y4 b I5 R- O
. w0 F: m5 Y- w8 Y0 J& B2 D8 e# E
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
0 B( m8 d7 l) l8 A% z; i$ C
2 i1 B7 i- N; i4 `7 E" w$ S
GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。
/ q J/ ^( ?, f- M& o
1 m# L4 Y3 q. h; |) H
GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。
6 z7 T B; q5 u* H, x
1 S9 j8 l8 E: l) `, G$ g/ O" u
GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。
) n$ w1 D+ Y4 q" w; ?
9 Z x3 x3 c& U9 k; Q6 u
改造字库
: o' W, r& o8 W8 D
3 _+ G, [9 `: |& b+ O
我们现在要做的就是将GB2312中的6763个汉字加入到GF的字库中去。汉字点阵定为16*16。因为游戏中仍要部分内容要以英文方式显示,所以我们加入汉字并不应该破坏原有的英文点阵字库,而是应该在英文字库尾部追加这6763个汉字。
$ i: g( O6 ]0 c1 B" C
. I' `1 | O& t8 @1 b S3 R" ?
1. 首先要修改文件头部分,每个字段都要做相应调整。
- H0 Q7 W+ L* ]. d0 ?0 E
; x. r! g# T! f& r" j3 M
2. 由于汉字编码范围是2121H-777EH,所以字体索引表至少要扩大为777E*2个字节。索引表的内容前512字节为原始的英文字体索引表,应该保留。在此之后,凡遇到字体索引表中GB2312汉字编码处是汉字的位置,添加汉字在字体偏移量表中的偏移量。汉字偏移量应该从0x100开始(前256是英文字库)
) _ N6 e1 b& j7 i5 W1 y# ~( P& ?
! }7 ?4 Q; w% u7 w
3. 重建字体偏移量表,将6763个汉字在字体点阵的偏移量、汉字宽0x10,汉字高0x10写入。
2 ~- s# L: `3 b7 h6 m i
& F. {% J& W+ X) Q2 W% k
4. 将6763个汉字的点阵追加到原来英文点阵的尾部。
- H7 N/ Y+ h/ q/ y9 A3 Y; t
6 U$ B5 v. _' B3 v! N3 u5 V
经过以上4部,字库改造完毕。虽然修改只有4部分,但是每部分都涉及到各种偏移量的计算,多字节高低位的读取等、文件头的再修改等步骤,代码实现起来非常麻烦,稍有不甚就会失败,甚至导致GF运行时直接崩溃,调试时需要特别的耐心才行。
\8 L# f/ v+ }+ z+ c
' q' b: e' A3 c
在生成新的字库后,把新字库覆盖掉原来Data000.LAB中的同名字库文件,字库的修改就大功告成了。
作者:
firendless
时间:
2009-3-17 16:53
不需要考虑高低位问题,程序自己会搞定,比如储存65534[&hFFFE] 用程序来做会自动储存为FE FF
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2