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

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

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

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

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

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

现在的游戏大部分是用矢量字体了,但以前的游戏一般都是用点阵字体。下面先介绍一下点阵字体显示原理。
" f9 T* G! _" V; G+ }' j! V/ f  k7 F" D, L! L
汉字内码 2 I" Z  m0 L. ]# M! ]" X8 v+ I
  点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。
9 ?) s' n6 ^2 f, z5 D3 h. I! P3 u
8 W/ x# F( E( c% z, u汉字字模 " {* ^% x" ^* B5 o; o  Q# B: D, ^
  得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的:
  ]* P8 J  c( `
2 C% y, @9 \0 A2 ` 3 p- o5 W" W' w: ?1 `3 F$ a
6 s3 E0 P7 b4 t& I' ~: n

  v9 A6 V* y8 o. a. t- m- Z0 G而中文的“你”在字模中却是这样记载的:
5 h# i6 h& w5 i! m1 r' e$ j3 }  
7 n# H! I& k9 o. X2 H" G6 B' m1 k5 }" |, @' g3 w8 T
, D% J. }. v1 F5 w0 K

+ f2 K6 J: @6 _6 w1 _所有的汉字字模组成点阵字库,像以前Dos下常用的Ucdos汉字系统就是用的点阵字库,点阵字库根据不同需要有好多种尺寸,如16*16 24*24,点越多显示的字越细致,特别是显示那些笔划比较多的字,效果越好。
( n0 h0 @% y  C1 Y; N" ?4 D& V' [, n2 K: G* h* h# T
下面进入GF字体的世界,GF的字体扩展名是.LAF,都打包存储于Data000.LAB文件中。先分析一下LAF的文件格式,然后再讨论如何在字库中加入中文。LAF格式由文件头、字体索引表、字体偏移量表、字体点阵四部分组成。
, z  s* f! V" p8 @9 M, g; A5 b! Y7 h
1.  文件头(32字节) 7 o" T" j& `/ R+ z$ C" U) k
9 g# B+ {, b: J0 x& e
字段 . e; e  }& L6 h+ C6 u
数据长度
" X0 c/ P% ^4 L6 S4 p7 S1 E( G2 l 描述 ) ]( G+ L) c1 H0 K& ?

# O: x5 g, L/ T& w# V1 N" ECharnum 7 x. m$ w% O) [: M6 c
Long(4字节)   T7 q, G6 I* n0 X3 P; t
字库中字体个数 % T3 A' X8 o5 {. j

" U5 x( T/ z- s* e$ K1 G$ Yfontsize
' t  E# o( Z% r$ _ Long(4字节)
6 \- o* w# }5 V' C( S/ i 字体点阵部分的数据长度 , z9 u" w! b& r# J

! h: X2 v8 {  p4 Q/ E7 _MaxWidth 1 \! a* b" Z1 f2 R" u
Long(4字节)
5 A2 |# @3 q  k+ E0 J# O 字体最大宽度
9 L0 j. ~; s& E. d+ L  j4 O/ @$ | , _0 e: r- t  R, O/ h( m7 |7 x) _
MaxHeight
5 N* `( Y  c$ z4 u& `: F$ Q, D Long(4字节) 2 R( d& F( r2 O" l, o0 t- x
字体最大高度
9 M) W) R. ~$ Y2 P0 o5 O0 y' R
9 b+ ^& _( Q% f+ cUnknown
' ?* m, l4 ^- `  K/ D5 e- ~) y9 o Long(8字节) 5 G& P# V7 S- K
未知 ( o8 n3 [8 R* t0 I6 f8 u0 m$ O

: p- I0 D7 O. o; [FirstChar ; m& U3 o3 X+ Y2 V
Long(4字节)
3 p6 Z9 m& o; w. J+ W6 O 第一个字符编码
! d" M1 O! L0 H# { * H; Y: h) F0 K5 g$ ^
LastChar
+ u7 U; ?- T# e, Y& u Long(4字节) 9 p; J9 _+ \* a6 _8 G
最后一个字符编码
& E# ^- J0 `8 Y/ d
; c2 P! P( O5 Z. V7 U" ?2 _5 G5 c) e" U) |
  5 F( h! m1 T! t! x2 p

2 r' Z9 ^8 _1 Y' E! G5 r( ]2.  字体索引表
% W' Q/ H; u0 i! P
- z$ b4 @  R! r. T, ?与字体编码范围相对应,每个双字节保存一个字模在偏移量表中的偏移量。如GF的英文字库是显示ASCII码表中0-FF的字符,所以有256个字模,字体索引表有256*2 =512字节。保存内容为这256个字模在字体偏移量表中的偏移量 1 L3 h+ K$ c+ Z5 k$ V# l

0 X/ T4 C4 ]7 x( @3.  字体偏移量表(与字体个数一一对应)
3 V! O0 ]  P, E3 [
+ N/ M; |/ ?" F5 b" J字段
( Y) d0 k( P* F, ]5 b. r 数据长度
) A' j4 u& t7 p- X# p" U9 W 描述
8 j; c" R" i/ ]/ f+ N; {
- A, r# T" c' @Offset
* W* k" J. Y) s. B Long(4字节)
  R: S9 h5 Q& E  b7 g/ D 此字模相对字体点阵的偏移量 2 y9 \/ h$ N/ [
" T* A# Y$ h8 @* d# L
Unknown ; s9 g# v) W/ C  t
Long(4字节) 8 T& [- A) C9 H7 p$ }
未知
1 n, W; x5 m! Z& D( M( x
% R% A4 O: i3 WWidth / k* V) O" m) U9 j5 M3 Q* ?
Long(4字节) $ Z3 s3 g8 H3 A. P) W' ]4 {
字模宽度 # f8 O& n  c5 B" }! {
: o) m" A2 d+ |2 [
Height
7 [7 k' |) m3 B* C+ y: {$ x: K9 ~ Long(4字节)
1 ~4 k) o7 Y* v8 x$ ?0 c 字模高度
* w0 ~. b7 f5 D# P* O ) D/ O( ]% [$ j$ |  K: v

6 C2 G0 E. l- ?. i" v  
2 o, J1 F$ b6 \9 G- k( l1 u' `
4 Q- |% x3 |, N' `$ }  y  c, D4.  字体点阵 7 E6 }1 D8 `3 Z$ R3 X7 P
+ j& y8 m/ x( S6 d9 H7 `, y
保存字体点阵。字体点阵的保存顺序是,从左到右,从上到下。0代表无点,ff代表有点。(这是GF点阵与一般字体点阵的区别,一般字体点阵一个二进制位的1代表一个点,但是GF的字库0xFF才代表一个点)。 ; o3 g$ ~& Q! R( `
/ J2 J2 b! P: \
现在举一个GF中的点阵的例子,下图是GF中汉字“选”的点阵,可以基本看出字形吧,每个汉字都要做成这样的点阵加入到字库中去。   d) b& ~- L& y+ p5 e6 o
" n  E& D& W* {1 ?

! L0 A' h. D& I! R" L+ e$ V  . g6 U! e- V) \" c# o
2 z! y- ?( L7 G" N- }/ h& s( J
现在举一个例子,说明GF程序如何显示一个英文字母N。(N的ASCII码是0x4E)
( P' ~3 X( `/ q$ Q/ N2 e6 T  I1 `! S; K" n# U+ T" j
1.  在字体索引表中找到字模在偏移量表中的偏移量。读文件32+4E*2 = 0xBC处的双字,得到偏移量4E。 " |0 A" d* U& M3 F
+ ]* d" M6 `, ~
2.  在字体偏移量表中得到字体点阵的偏移量。读文件32+512+4E*16 = 0x700处得到字体点阵的偏移量0x17c0,再读0x708h得到字体N的宽0x0A,再读0x70ch处得到字体N的高0x0C。 3 H+ r" c3 E. [& c4 ?
5 F# q) r2 O4 f1 g  Y
3.  读字体点阵显示字符N。字体点阵的首地址为16*256+512+32 = 0x1220H。字体N的点阵部分是在文件0x1220H+0x17c0H到0x1220H+0x17c0H+0D*0A之间。 & i0 ~4 L  a+ V+ ^- n
1 z: R) E# n$ c$ K% W; S& j# X
  
) t: Z7 U2 B( \$ C8 H
9 `' Z& t( n8 I4 R! B+ W: F汉字编码GB2312-80简介
! \: e& E7 W1 O; N5 f# ~- l- k2 J0 M4 h  A- Z: l# ~" w' }
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
1 c7 W0 z1 h" l- A1 h2 Z7 e) z6 t1 S6 K3 R6 @$ I
  GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。
) Z2 W% U& k+ a+ m! Q& K9 h6 C0 N! j: {- V4 n( ^) R' e6 e! p/ {9 u
  GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。 ; g; }( Y0 Q  e$ i) {0 ^6 l
6 c( ?+ u) I( g1 N7 {
GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。
, l( R& x+ Y1 Z2 m! W9 n* K- o" j' D" g; Z8 I, ]
改造字库
5 ?! q3 _4 @1 v' Z6 Y4 p$ R4 l
5 D7 y& s+ H9 s4 ?1 A  E9 K我们现在要做的就是将GB2312中的6763个汉字加入到GF的字库中去。汉字点阵定为16*16。因为游戏中仍要部分内容要以英文方式显示,所以我们加入汉字并不应该破坏原有的英文点阵字库,而是应该在英文字库尾部追加这6763个汉字。 3 Y* |" z, Y$ c9 S8 P

; A6 y! \8 C* G; N" f) `. y1.  首先要修改文件头部分,每个字段都要做相应调整。
1 T9 }* s3 P' ]' D  y" v* M# l+ [) C$ X$ Z
2.  由于汉字编码范围是2121H-777EH,所以字体索引表至少要扩大为777E*2个字节。索引表的内容前512字节为原始的英文字体索引表,应该保留。在此之后,凡遇到字体索引表中GB2312汉字编码处是汉字的位置,添加汉字在字体偏移量表中的偏移量。汉字偏移量应该从0x100开始(前256是英文字库) ) E6 ~/ p" A+ o
* h- `+ a4 _5 A6 V5 S& V9 x  l
3.  重建字体偏移量表,将6763个汉字在字体点阵的偏移量、汉字宽0x10,汉字高0x10写入。 / d( |* }. q# }3 J# j

4 L3 W( k" k! P: I* i% c+ f' q( _$ S4.  将6763个汉字的点阵追加到原来英文点阵的尾部。
( B7 r% |: B1 B# L, q% X
7 D# @7 f+ V% q- \# z经过以上4部,字库改造完毕。虽然修改只有4部分,但是每部分都涉及到各种偏移量的计算,多字节高低位的读取等、文件头的再修改等步骤,代码实现起来非常麻烦,稍有不甚就会失败,甚至导致GF运行时直接崩溃,调试时需要特别的耐心才行。
5 A. R" j. J; F
9 n4 V+ T3 X$ Q  Y* I; i    在生成新的字库后,把新字库覆盖掉原来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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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