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

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

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

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

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

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

现在的游戏大部分是用矢量字体了,但以前的游戏一般都是用点阵字体。下面先介绍一下点阵字体显示原理。 % d5 p  j1 k# m1 L

7 k- r! {: M4 j/ c  Z汉字内码   _9 B7 \9 X  }4 S: W
  点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 $ P- |$ X- D4 [4 K; r; W4 @

8 U8 Z) |  B7 N$ Z汉字字模
9 m8 Q+ G: u' s  k/ Q8 i5 ]- e  得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的: 5 a' C+ E! q  l3 K, U

. {1 o) z, v' T0 h3 L
6 Y& j: d: |: w$ R
1 e7 H# g; [  `& t  z! I% t9 B( p3 Q: ^' p- T
而中文的“你”在字模中却是这样记载的: + s) N: M% |: N$ v1 q
  5 E3 A" K! Q8 ?7 q

+ ]* J! i% Z5 ^" H3 |2 |) u0 s- _* I: u

3 f) r. ]: _& a2 S9 y9 F所有的汉字字模组成点阵字库,像以前Dos下常用的Ucdos汉字系统就是用的点阵字库,点阵字库根据不同需要有好多种尺寸,如16*16 24*24,点越多显示的字越细致,特别是显示那些笔划比较多的字,效果越好。 6 @5 G- ~4 |8 r3 _$ z7 i

& X/ l6 Q- O. H+ {, X5 n下面进入GF字体的世界,GF的字体扩展名是.LAF,都打包存储于Data000.LAB文件中。先分析一下LAF的文件格式,然后再讨论如何在字库中加入中文。LAF格式由文件头、字体索引表、字体偏移量表、字体点阵四部分组成。 / ~. T) }  e5 Z& l( m4 ~

/ W9 F& L9 F1 r* _8 O' S1.  文件头(32字节)
# B( R$ V5 a' t' c  f2 ]5 B, Y% T# X% r
字段
3 U) j- W- x; ~4 D5 x0 e; a2 D2 @$ Z 数据长度   m2 ~6 B8 J! q% @: B3 g
描述 $ v% b' m! A4 F) G/ L

1 V; i  I/ O+ G) B# j4 [/ @Charnum 6 d0 ^5 o9 E) U! Z6 R; i" c6 e
Long(4字节)
# D( s! [7 a4 I2 W: h  _ 字库中字体个数
# V% x  d4 R, @9 H0 D8 s
5 j& m1 x5 P/ S5 B5 u5 ?fontsize
# J$ U) A4 f: R5 |, t2 V: A( ] Long(4字节)
! \6 L4 F+ Y7 j& c( _ 字体点阵部分的数据长度 & Q/ c; B. K! c
6 N- U4 a7 |, _/ _8 e- m5 U
MaxWidth 4 d0 P' _# w3 w$ u4 g) l8 f$ j7 ]
Long(4字节) * P  u/ X5 ^8 B) v) ~
字体最大宽度 % c+ e: D/ U# F  q2 [& u, ?
" L$ V7 U3 b; z" g5 ?
MaxHeight
. S+ X) P- u6 j1 i Long(4字节) 2 _) |! |" c6 A) p
字体最大高度 % H0 a" \; Q" V, }

. ~6 V' C9 i7 [8 w! ]Unknown 7 E2 d: X7 {' M( K- P
Long(8字节)
7 k0 _* [& x# y: T# c 未知   ^7 l4 c7 n( C# r1 K

* q1 A: b% f% K8 ?FirstChar
1 |* s+ F" p& L2 f' V3 c Long(4字节)
6 V' o6 f5 E, J3 C2 |  l" \9 ^ 第一个字符编码 / O9 h# r& y4 N0 O3 i# M
0 l  ^# j  _% w! B! L$ r1 p
LastChar 0 C1 X( |+ S! G( v8 \6 M
Long(4字节)
2 \9 @8 S  {3 r 最后一个字符编码 - i( W  N( \. \, ]$ l
9 \! y2 P/ Q% R3 V
, F2 i) u9 S3 c# K" B
  
# b. |3 v9 E% p' c; x# l4 j! p# c- U' g$ g& i
2.  字体索引表 8 ]2 @6 s) p1 d/ a1 R$ r: K
1 k" O2 l; b7 H( U+ {
与字体编码范围相对应,每个双字节保存一个字模在偏移量表中的偏移量。如GF的英文字库是显示ASCII码表中0-FF的字符,所以有256个字模,字体索引表有256*2 =512字节。保存内容为这256个字模在字体偏移量表中的偏移量
7 {6 D; N9 J; ]4 |4 h8 e; f! R' d9 B" m% F% [4 ~, x2 e. m+ I
3.  字体偏移量表(与字体个数一一对应)
* O  L, I) j& y0 a! o
- Z' m+ p; a0 J5 J4 ]4 `' N9 D字段 9 o+ g! G% o% w0 I! w
数据长度
7 I  k& p2 u' C( f* _ 描述
0 Y9 @8 t' ~+ s2 ~* n3 J- B
& m+ q/ x8 N. j3 [Offset * D, T! S0 A6 `
Long(4字节) 4 Q" O; _1 m8 w  A% ?" K7 w6 J
此字模相对字体点阵的偏移量
2 }7 `6 F/ q6 G9 T 3 L) U; k, y: ?; T+ }- N, w
Unknown % P/ E% S! }6 j  k4 f
Long(4字节)
$ o6 e& ?6 T& }. e. ?1 @6 {+ J  y0 Q 未知 ( |7 d; Q3 }2 l6 x

1 s0 N% I& h+ ?: j7 ]9 o0 n8 bWidth
8 m. [# J: y, v# ?% `) f- p- L Long(4字节) # F1 D9 B9 J6 P% l0 A" i
字模宽度
9 Y1 H( F5 [; w) h 8 c/ g* l: J; p3 V4 U5 n* ]7 n/ W
Height ) T- t6 G, c3 T" w7 }: [4 p
Long(4字节)
9 k8 g  m4 O: d9 K/ l( O: T+ n; } 字模高度 1 Q9 J" O9 |5 F$ _4 e6 B* T

- {9 j3 s$ b1 x  m' n) ^  D
( t0 A& E+ j6 J7 ]: C5 z: D  
$ w$ u( i. I% T$ D
4 H# m" z. S8 c7 v/ Q4.  字体点阵 2 d& D* p5 m5 g3 }( P8 ^

2 }* c( F5 c0 G* Y& G7 n- W  x% j保存字体点阵。字体点阵的保存顺序是,从左到右,从上到下。0代表无点,ff代表有点。(这是GF点阵与一般字体点阵的区别,一般字体点阵一个二进制位的1代表一个点,但是GF的字库0xFF才代表一个点)。
) Z- X; l4 ^' D( u) U- E" m
) P* A0 ]3 Y2 v6 e: L7 Z' D1 i现在举一个GF中的点阵的例子,下图是GF中汉字“选”的点阵,可以基本看出字形吧,每个汉字都要做成这样的点阵加入到字库中去。 7 H6 h: H& l; {# R1 }7 x

. W; V+ q6 z* h  J: u1 F5 M* R2 l, `% w* o! J
  
: v  I( k4 x2 F2 R
' _( G% @- d  g  z, ]9 r现在举一个例子,说明GF程序如何显示一个英文字母N。(N的ASCII码是0x4E) & C5 a4 K" Z& u# ~6 W+ T
6 j9 \& l$ J. f) m/ e) p% ]
1.  在字体索引表中找到字模在偏移量表中的偏移量。读文件32+4E*2 = 0xBC处的双字,得到偏移量4E。 % r( F  W5 m# y" s
- f2 Z& v- X9 d# I, u
2.  在字体偏移量表中得到字体点阵的偏移量。读文件32+512+4E*16 = 0x700处得到字体点阵的偏移量0x17c0,再读0x708h得到字体N的宽0x0A,再读0x70ch处得到字体N的高0x0C。 6 _7 k% _+ G& s( h7 B  X0 s
% {, a1 J, B/ f5 l- p
3.  读字体点阵显示字符N。字体点阵的首地址为16*256+512+32 = 0x1220H。字体N的点阵部分是在文件0x1220H+0x17c0H到0x1220H+0x17c0H+0D*0A之间。
+ R1 ]  X/ u  h4 J8 r& d3 c  g
) g9 F/ }6 G- }6 n# u: M) m6 B  & X  P$ b6 E. i3 \

% h2 f2 d9 E8 P. m3 o  Q汉字编码GB2312-80简介 , x5 W# Z$ F9 a4 \
3 e: n, S. Q( D6 S9 x
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
% Q( D/ J+ n0 K- c1 g
7 L( I, Z) I' b# |  GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。 / @5 e$ z0 R. e% m
: e  U* r* F- r, B$ @: ?7 {
  GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。
% F3 a; i3 a1 b1 j/ Q& n4 a3 E1 A% I2 r+ H3 F* R
GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。   x8 x. L* K, m" O
2 z9 d2 c% ~* i& s. @0 @; h
改造字库 4 @$ D6 k6 N1 T" @6 z5 ~0 \
1 q3 f4 f- |: c- m! I8 A
我们现在要做的就是将GB2312中的6763个汉字加入到GF的字库中去。汉字点阵定为16*16。因为游戏中仍要部分内容要以英文方式显示,所以我们加入汉字并不应该破坏原有的英文点阵字库,而是应该在英文字库尾部追加这6763个汉字。 ; p$ E. B; e! Q, t* i3 b4 x+ L3 a
1 {( \0 n$ u* Z# R% j. j; ~$ m3 @
1.  首先要修改文件头部分,每个字段都要做相应调整。
$ R; @$ j) e# N) b* N3 S, K$ o. [7 F
) `6 z& a# U: C3 f$ |+ k2 r0 K2.  由于汉字编码范围是2121H-777EH,所以字体索引表至少要扩大为777E*2个字节。索引表的内容前512字节为原始的英文字体索引表,应该保留。在此之后,凡遇到字体索引表中GB2312汉字编码处是汉字的位置,添加汉字在字体偏移量表中的偏移量。汉字偏移量应该从0x100开始(前256是英文字库) : K& h" S4 Q: v* b8 O5 L

  ^$ h3 B7 F1 `3.  重建字体偏移量表,将6763个汉字在字体点阵的偏移量、汉字宽0x10,汉字高0x10写入。
4 P$ M9 \) i8 @2 r2 s# L8 \# h  ?! T' Y% w- t
4.  将6763个汉字的点阵追加到原来英文点阵的尾部。
/ H1 T6 ~. G% o6 U
3 G6 S. u: [8 J( K9 a+ ^/ {9 }经过以上4部,字库改造完毕。虽然修改只有4部分,但是每部分都涉及到各种偏移量的计算,多字节高低位的读取等、文件头的再修改等步骤,代码实现起来非常麻烦,稍有不甚就会失败,甚至导致GF运行时直接崩溃,调试时需要特别的耐心才行。   R, f' r2 ?) X8 ^5 O5 q9 O

7 C/ q, K: ?* c% Q% _0 ~    在生成新的字库后,把新字库覆盖掉原来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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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