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

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

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

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

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

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

现在的游戏大部分是用矢量字体了,但以前的游戏一般都是用点阵字体。下面先介绍一下点阵字体显示原理。 0 E& s: F; Z( L) T: K' {
# q4 R$ ^* A" V% z, t2 D& U6 Y
汉字内码
4 W( e1 {% j* F7 e% g  点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。
) b% I$ Z, S/ k9 D  k8 g2 v
9 I% j% u+ O  v# S* n* p汉字字模
4 j9 L& C* j9 n4 r3 }( V0 S  得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的:
. k% L# e. }+ a8 x' M1 m, B2 r1 S" k5 [3 p% S* R# `4 M
8 d$ z1 t8 v& i5 i2 p0 X! C( t3 d

' O  A# |! U; e5 V& G" {3 a0 \; H0 |6 ~/ S
而中文的“你”在字模中却是这样记载的: * G' Q9 c! [  G! C: M
  
# t8 a3 v5 p7 I4 W7 p: J3 U; N5 {* H& c$ l0 `

8 u( P8 z# [  o; \7 v! h6 o6 p* v6 p  ?7 {
所有的汉字字模组成点阵字库,像以前Dos下常用的Ucdos汉字系统就是用的点阵字库,点阵字库根据不同需要有好多种尺寸,如16*16 24*24,点越多显示的字越细致,特别是显示那些笔划比较多的字,效果越好。
; m3 t; R# K4 N8 U7 p: Z: c3 ~
! J/ W; c. a/ F$ j- Z7 i; g$ w& L下面进入GF字体的世界,GF的字体扩展名是.LAF,都打包存储于Data000.LAB文件中。先分析一下LAF的文件格式,然后再讨论如何在字库中加入中文。LAF格式由文件头、字体索引表、字体偏移量表、字体点阵四部分组成。 + y0 c4 N' Z$ G7 K9 ?1 m1 s
, ?; ^: g; E! D, r+ ~, s6 B
1.  文件头(32字节)
8 j3 b+ W/ `; N" `
* e3 Y9 g/ g* P8 e字段 8 r1 I9 M* J2 N) ?8 D
数据长度
# I: s7 x% Y4 @! n: d+ D 描述 , \! b* q8 q. f' O

" ~9 c! T3 H0 qCharnum ( K- c: O: D; r2 Y2 N
Long(4字节)
+ g4 \+ n6 C1 u4 ~( d 字库中字体个数 & P  D% h% E/ w# Y
' y2 t4 V9 ^9 \, P( {2 Q, l! @, h
fontsize
; {+ r) B! u0 n+ h" {" z Long(4字节)
. m$ Y; c1 i! z: @3 W: H 字体点阵部分的数据长度
& `+ c* r3 `5 s% m: s& ]* P6 s 2 E5 k) W7 l  @& @7 x
MaxWidth # [) s+ U9 x- X! m
Long(4字节) . X, O1 F8 ]% X$ i% }  Z! U
字体最大宽度
( ^' F2 n2 Q1 ?( ~: i& r
: Z. _* J7 K1 v' M4 G4 o5 NMaxHeight
  q5 L& I8 K8 c Long(4字节)
* s$ v$ J7 E4 b5 i! f7 M 字体最大高度 5 w/ Z# c5 i( X" O
; K6 s- R) d7 K- Z' y2 y
Unknown
6 n& [" M, _+ M7 h Long(8字节)
9 }$ O& T) I: M: n; }; ^ 未知
+ [0 o' V7 W  S+ `% i : N, W5 r7 z1 _, S* ^
FirstChar
1 g; ]' m" `  @. ?: Z9 n( u Long(4字节) 9 E" j% e/ o# z2 x
第一个字符编码 ; s; N" O3 V; z" ~& o9 R: o
0 m3 D+ s* I. L$ r5 k" n, s
LastChar
2 c7 d9 L8 y" v/ N Long(4字节)
  c# x! Z1 |* u 最后一个字符编码 4 V% V- Y8 ]# T' r/ b* Z1 B# i6 k

% [& u, l5 p5 e1 [! `
& `$ L* E, U+ ^6 q+ O! X" n  2 k) k0 H, a: Y1 |% _3 B
& B3 g8 m5 g- q% I. n4 b# l
2.  字体索引表
2 G. M* k5 n( I5 ~
$ f  f4 M: L5 m6 X7 t3 ~* h与字体编码范围相对应,每个双字节保存一个字模在偏移量表中的偏移量。如GF的英文字库是显示ASCII码表中0-FF的字符,所以有256个字模,字体索引表有256*2 =512字节。保存内容为这256个字模在字体偏移量表中的偏移量 % l3 \8 O/ R) `- g
* J% }- Z9 d, \3 }
3.  字体偏移量表(与字体个数一一对应) $ N- L. R; d# _( Z

/ e5 A2 W; P3 g# ]4 c3 ~4 q% z3 v字段
  r3 e3 q8 u7 h& |8 ]0 k. I* n 数据长度 + ~1 t4 u3 {) u- Z) b3 u: A
描述 # R# |/ c  ^1 I  S/ }8 A% a; W
7 p  h* U5 O: v' S
Offset   [' ^$ ^* M* y( ?! z) E
Long(4字节)
2 |/ a/ n2 x5 n2 n. \ 此字模相对字体点阵的偏移量 , M8 ^  e; v2 ^/ Q* R

4 z, ^+ D, g2 _' E/ j* ]* uUnknown
7 X1 K' [$ D  e( O* C$ Z; w Long(4字节) # r9 g6 w9 ]4 |0 y) S3 I0 q
未知 ( I2 d: y4 {, E# P2 F; \

0 Q0 a; l1 ~  C% r1 k$ h. o! PWidth
" b5 x8 m  C, d  p5 K9 L Long(4字节) # q5 D2 p% F3 }2 U& i" d7 l
字模宽度 - M$ N$ [. l' Q  k0 _7 w  P

2 P  D' r! q' v  w* rHeight
) ^5 f9 r# y& x: f4 \: Q  c: g Long(4字节) ' [, L& Q3 ?* {4 q
字模高度 6 w+ [/ ?9 m7 P) A" ?* Y7 {* d
' c8 R$ }/ R- M
" x. R% W* c- h" t, ^
  
9 z  Y7 N/ H3 u! j9 _+ o
( E" ^# u% ^7 b: |1 ~2 J+ j7 X4.  字体点阵 , I, t9 ~0 M4 V" G  k8 m
: I: o# f  i$ u5 D( p
保存字体点阵。字体点阵的保存顺序是,从左到右,从上到下。0代表无点,ff代表有点。(这是GF点阵与一般字体点阵的区别,一般字体点阵一个二进制位的1代表一个点,但是GF的字库0xFF才代表一个点)。 ; r6 E5 n. _2 d* U2 R
/ G4 s1 F0 _" P1 i0 g4 h
现在举一个GF中的点阵的例子,下图是GF中汉字“选”的点阵,可以基本看出字形吧,每个汉字都要做成这样的点阵加入到字库中去。   H# c" i- t# n; p  \' w5 t0 q) n1 ]

$ ^$ p8 E1 {, A4 {% \
8 T) z+ f$ i  r  " b6 h4 A  p' W$ m" {' _( a: ~4 o

, W- {6 J  Z, Y5 Q& I" M& X& V现在举一个例子,说明GF程序如何显示一个英文字母N。(N的ASCII码是0x4E)
9 l( P  [: u1 h- V
+ A7 l# p0 U2 n. P  V1.  在字体索引表中找到字模在偏移量表中的偏移量。读文件32+4E*2 = 0xBC处的双字,得到偏移量4E。 & |# {& u8 ~* p6 J6 E# v4 ^2 F
1 C0 I5 L4 [/ S+ o
2.  在字体偏移量表中得到字体点阵的偏移量。读文件32+512+4E*16 = 0x700处得到字体点阵的偏移量0x17c0,再读0x708h得到字体N的宽0x0A,再读0x70ch处得到字体N的高0x0C。
4 H. O* e( I, K+ v+ M
. Q2 r/ K# ~  T3.  读字体点阵显示字符N。字体点阵的首地址为16*256+512+32 = 0x1220H。字体N的点阵部分是在文件0x1220H+0x17c0H到0x1220H+0x17c0H+0D*0A之间。 $ H, [7 B3 B6 [; l& q7 q
' n# q; x7 U3 e2 ^6 P& A
  
9 \& b& \8 Q  @# o0 _  }- e  R' U7 T% v/ G1 k! L2 d6 p$ e1 G7 j6 X* @9 p
汉字编码GB2312-80简介
! K& s6 x# ?( B" n0 b* c
+ c6 W, ^9 T9 _4 Y4 hGB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
) {/ A) R9 f6 S- U1 O3 i" h9 Z) ?/ g3 V; m
  GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。
# F# y) n& y3 O2 j
2 C! A8 x7 O" \9 z- }* j  GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。 % O& j4 U$ Q8 M& h

; F; g" |! s2 }; p  DGB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。
: i1 Q  ^# h! d7 M$ ]( f) ]2 N% r  s, H8 M) S  a
改造字库
" U0 A' a8 U- l7 r4 E7 X! ]- C  V$ R* E3 z
我们现在要做的就是将GB2312中的6763个汉字加入到GF的字库中去。汉字点阵定为16*16。因为游戏中仍要部分内容要以英文方式显示,所以我们加入汉字并不应该破坏原有的英文点阵字库,而是应该在英文字库尾部追加这6763个汉字。
* I  P0 [, E( P8 T  K' T% j
0 B( b% j: k% O+ h1.  首先要修改文件头部分,每个字段都要做相应调整。 & F4 Y4 T2 _; a! ]* `
/ j7 t, J, x# ?& k3 F
2.  由于汉字编码范围是2121H-777EH,所以字体索引表至少要扩大为777E*2个字节。索引表的内容前512字节为原始的英文字体索引表,应该保留。在此之后,凡遇到字体索引表中GB2312汉字编码处是汉字的位置,添加汉字在字体偏移量表中的偏移量。汉字偏移量应该从0x100开始(前256是英文字库)
. S' I' N9 u3 F. a* G: G1 }$ L6 l. |$ }8 K7 \3 `
3.  重建字体偏移量表,将6763个汉字在字体点阵的偏移量、汉字宽0x10,汉字高0x10写入。 ' o+ v1 U8 M/ h% G3 r6 ]3 ^

  [4 T3 F1 w& L, |4.  将6763个汉字的点阵追加到原来英文点阵的尾部。 $ z( _0 A7 Y  q4 h# Z. |

5 q# n+ r- s9 H8 m  q8 w经过以上4部,字库改造完毕。虽然修改只有4部分,但是每部分都涉及到各种偏移量的计算,多字节高低位的读取等、文件头的再修改等步骤,代码实现起来非常麻烦,稍有不甚就会失败,甚至导致GF运行时直接崩溃,调试时需要特别的耐心才行。 $ B5 i( }8 F( o* V) Q, ]2 N

3 e0 j: y8 R; }" e( y    在生成新的字库后,把新字库覆盖掉原来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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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