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

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

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

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

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

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

现在的游戏大部分是用矢量字体了,但以前的游戏一般都是用点阵字体。下面先介绍一下点阵字体显示原理。 2 P  s- t% u6 S; l) R$ G
* E; O' J! j: |# {$ Z
汉字内码 0 `- i+ a, z# u! c
  点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 ) u1 ^9 p& M" R( g" H' U+ F

- A& m5 @4 s/ R汉字字模
! S. \5 m! o+ G3 p+ \& g7 F  ^  得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的: 1 N- @+ O, t* l% @. H1 r4 ~
& ^  ?5 X/ @+ A. @7 `
1 y0 g+ Q) L6 w6 `/ O% p2 R

! e) `7 A* R- [6 \/ h3 i
" U% P# N! L  m+ C9 L) j: @1 y而中文的“你”在字模中却是这样记载的: 9 w# g) Z+ G' W2 r& a
  
5 A+ m/ J5 U6 {* v8 u$ J
, Z; I( N. P: R! a% Y6 q, w1 f6 G# v
9 t0 A* \5 A) V3 ~  H& v7 x
所有的汉字字模组成点阵字库,像以前Dos下常用的Ucdos汉字系统就是用的点阵字库,点阵字库根据不同需要有好多种尺寸,如16*16 24*24,点越多显示的字越细致,特别是显示那些笔划比较多的字,效果越好。
- G# I' d* }( O7 D- J( l
5 \, P) ^0 I) V8 H7 W下面进入GF字体的世界,GF的字体扩展名是.LAF,都打包存储于Data000.LAB文件中。先分析一下LAF的文件格式,然后再讨论如何在字库中加入中文。LAF格式由文件头、字体索引表、字体偏移量表、字体点阵四部分组成。 8 a) X) x$ Q  ?) l# e0 Y
+ ^' X! U: _! L
1.  文件头(32字节)
8 d1 M9 F$ ?0 p0 U: N) O
! o7 M- t/ A2 Y0 l, t: R( O字段
4 t( l) s. K- W( e# Z& m2 v. u 数据长度 * o1 `! P6 l3 v& W9 M1 s
描述
, Y, x1 |- Z4 J( M4 ?3 J. U' d: [ ' H/ k) Y9 `; t/ d! e5 e$ F
Charnum
; [* s: x% Z+ Y! l& V Long(4字节)
3 w/ ~+ u0 ~4 ^8 C. s7 _  j2 y3 u 字库中字体个数
: `/ L$ c' y* U7 M, u
7 Z* I7 u% P- F0 ~/ V  u9 tfontsize
  L- g5 S! Y8 f) G! ^ Long(4字节) # e& s$ Z- ^8 e% p
字体点阵部分的数据长度
( l# g0 U: \- K
. |, O! f: R  D6 n8 jMaxWidth
% F0 R2 Y9 d; K Long(4字节)
# t% t% a& d+ K' z, U6 o/ e8 h 字体最大宽度 3 _' X1 g3 {2 U/ B' K/ ]# a# G  F

2 w- Q3 Z0 O- bMaxHeight
( I9 \/ k0 c$ ^1 y* P+ o! M Long(4字节)
. T1 b- G7 q& O7 r6 ^7 v  L 字体最大高度
! ]& j9 f! I& b4 M% _ ( z& N/ R4 ]( w4 ?+ W9 q" g# \7 E' U
Unknown
# \3 H1 ~8 x3 p Long(8字节) ) L  b0 P0 o' S7 }
未知
# @- j. j' h% b5 `+ v
# l3 G( P& I+ o, SFirstChar 2 A2 u" Y9 I8 ]2 S- C% X, X
Long(4字节) 6 i* C% M2 y# p: j8 i7 c$ F. G' F2 k
第一个字符编码
) Z' t( ]" y- N 0 E2 B% j6 K9 a
LastChar
$ w! _. u8 M% T! L/ x& x, A9 q) C Long(4字节)
5 Q- Q3 y) j& A- d, W. x 最后一个字符编码
0 y8 ~& A$ G! Z$ ^
( T; c& C0 B' Q5 I0 F  \4 A9 O. `% }. W
  
* c2 e: G" ^/ G- a4 \  G$ |% w: O4 x" B' n' S# u
2.  字体索引表 ! E$ a7 J( ]' J& K' S
( G& t/ U9 A# M0 J
与字体编码范围相对应,每个双字节保存一个字模在偏移量表中的偏移量。如GF的英文字库是显示ASCII码表中0-FF的字符,所以有256个字模,字体索引表有256*2 =512字节。保存内容为这256个字模在字体偏移量表中的偏移量
2 |. P& W- O; ]0 {3 U$ h+ @/ }' [+ F4 n
3.  字体偏移量表(与字体个数一一对应)
" c* _& U' N: X! Z; B, o4 f. k6 v  ~, F" E. ]7 k
字段 : Z0 C% a4 N8 g& m
数据长度 & @3 x* s/ p0 l. @$ `% C9 @
描述 / I& m0 h' w& Q/ w: @1 K$ n
) _5 P6 A7 x/ M$ ~) H% G* x3 q
Offset 8 H4 ~3 o  u5 L# I5 C3 ^
Long(4字节) - d" |+ w( T8 u) H7 ^, ~" W
此字模相对字体点阵的偏移量 ' y, o. z: f* X( m* @7 C

0 b' v# ]0 k) A" j& M: U) c# b- }Unknown
- H* K, e: t3 q& A& F0 ]9 v. I3 G Long(4字节) * C# W$ y, o' W, L* I6 k
未知
2 l! ~9 f9 U, \7 J- g
1 I4 G' x( S: \Width
* _2 E0 k9 X# s8 k7 t Long(4字节) 9 k8 v3 _+ H: S1 ^+ M
字模宽度
8 p" R* A& F# [
8 k( X9 N) ]7 |9 ~9 I# F, N, q) @# fHeight
3 ?+ k2 u3 d- R: j Long(4字节)
! J) `7 t" }- p& ` 字模高度
! d( t0 s; P. G( r
4 d5 w6 t6 }( W% I' ?
. x2 ^2 O1 D6 L; F  ' q; B6 E9 l3 v9 I+ g5 J# c8 j! W

& S6 o' j# C; m( R' C( N1 h, A  D4.  字体点阵
, n+ O& L% `+ C8 Z% f) ]! o
$ b$ u6 p& t( |( G6 r9 @  m保存字体点阵。字体点阵的保存顺序是,从左到右,从上到下。0代表无点,ff代表有点。(这是GF点阵与一般字体点阵的区别,一般字体点阵一个二进制位的1代表一个点,但是GF的字库0xFF才代表一个点)。 0 W. X" p0 s7 `9 H9 v  \1 \
& Y6 T# ?; `  L/ Z
现在举一个GF中的点阵的例子,下图是GF中汉字“选”的点阵,可以基本看出字形吧,每个汉字都要做成这样的点阵加入到字库中去。 " @% `5 V6 Z3 P% d: m

1 n( w$ A# r0 Q
  F/ T9 u9 f# e; v6 x6 p( H  $ w% `' Q  n7 E: |. }
# J: N$ O: z1 o. m
现在举一个例子,说明GF程序如何显示一个英文字母N。(N的ASCII码是0x4E)
/ `% c! x( s& F7 H0 A1 n  t, ]6 Y, h( a' M- N1 i
1.  在字体索引表中找到字模在偏移量表中的偏移量。读文件32+4E*2 = 0xBC处的双字,得到偏移量4E。 8 o4 }9 |/ k" h' [6 g
; M& W! s/ l! P7 p2 Z1 d
2.  在字体偏移量表中得到字体点阵的偏移量。读文件32+512+4E*16 = 0x700处得到字体点阵的偏移量0x17c0,再读0x708h得到字体N的宽0x0A,再读0x70ch处得到字体N的高0x0C。 - ?/ {9 }" J4 F: K# r8 u

) B; B: o+ n* Y9 G# a: ?/ T1 r8 g% Y; R5 r3.  读字体点阵显示字符N。字体点阵的首地址为16*256+512+32 = 0x1220H。字体N的点阵部分是在文件0x1220H+0x17c0H到0x1220H+0x17c0H+0D*0A之间。 ! j: S; _9 A2 g
* T  X( B7 A" n4 p+ C6 l1 X7 y4 N' j
  
, O0 d5 V5 V4 E4 S& u& \+ v# S$ j$ t' `# w+ b
汉字编码GB2312-80简介
% J+ H7 B  U+ B5 h. `* [
2 K. R6 b3 {+ M5 ~/ x2 SGB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
- X% e& P- v: f  }  n" H3 M( D* b) X- b! T; m) ?7 ?2 N$ V
  GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。
+ f8 {4 y( v& N' l7 m2 _
. A0 p7 S- s7 `9 R, g  GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。 6 g1 l( d5 h. B  n; \  j8 S
5 o' g1 l& q2 B$ `% A
GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。 0 e& y9 C6 H( d

4 K# R% A, u0 Z& [改造字库 $ X- e! X4 T: Z! K0 }
5 [& G1 \  o( x8 f/ j# U5 M, A+ [
我们现在要做的就是将GB2312中的6763个汉字加入到GF的字库中去。汉字点阵定为16*16。因为游戏中仍要部分内容要以英文方式显示,所以我们加入汉字并不应该破坏原有的英文点阵字库,而是应该在英文字库尾部追加这6763个汉字。 % |& m( D1 @' [
8 A! ^, D1 z0 A! o. \
1.  首先要修改文件头部分,每个字段都要做相应调整。
9 R7 L2 l. R6 x+ h
7 h) t4 u5 N) R, M2.  由于汉字编码范围是2121H-777EH,所以字体索引表至少要扩大为777E*2个字节。索引表的内容前512字节为原始的英文字体索引表,应该保留。在此之后,凡遇到字体索引表中GB2312汉字编码处是汉字的位置,添加汉字在字体偏移量表中的偏移量。汉字偏移量应该从0x100开始(前256是英文字库) / k. O5 j; W1 E

! |8 Z# `$ \& M) q/ I1 B! U! q3.  重建字体偏移量表,将6763个汉字在字体点阵的偏移量、汉字宽0x10,汉字高0x10写入。   G6 b# T6 u6 A/ _
4 j9 Q2 n. W5 L" u
4.  将6763个汉字的点阵追加到原来英文点阵的尾部。
8 j- C6 `6 W# I/ e: ~& k! `" [4 j
, J, ~+ E0 G5 j" T7 n经过以上4部,字库改造完毕。虽然修改只有4部分,但是每部分都涉及到各种偏移量的计算,多字节高低位的读取等、文件头的再修改等步骤,代码实现起来非常麻烦,稍有不甚就会失败,甚至导致GF运行时直接崩溃,调试时需要特别的耐心才行。
/ t4 P( ~+ z) s7 L
6 j" b  H1 C% c5 m    在生成新的字库后,把新字库覆盖掉原来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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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