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

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

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

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

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

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

现在的游戏大部分是用矢量字体了,但以前的游戏一般都是用点阵字体。下面先介绍一下点阵字体显示原理。 5 Y, i8 L% ?" n) ]; z6 X# L
( c) x0 ?6 `) m
汉字内码 6 U5 k/ l: \3 r; y: A# Q0 w. u2 ^
  点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。
# N0 B5 d, n9 U, x) g
$ J$ w0 k* r" K6 x" c; R3 \" V; p汉字字模
, F. ~. [; H( d  得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的: 0 ]7 x: X% Z/ ?- _  T* Y+ ]
% ^9 f; Z, |: F- f

  `- J+ C' U0 K& B! s$ q" v. O4 f
* S; a: U. b8 z, K6 A) k- c* N7 X
$ e( Z8 [5 H; H* h而中文的“你”在字模中却是这样记载的: # a* o( h% E7 d; z" v5 m
  
9 {0 {0 F* D% y( Y2 ]) s- i4 B
* o4 V& @0 P, f; i4 D5 [! A# y# e" @5 y  i

7 ^+ o0 e+ Y+ P所有的汉字字模组成点阵字库,像以前Dos下常用的Ucdos汉字系统就是用的点阵字库,点阵字库根据不同需要有好多种尺寸,如16*16 24*24,点越多显示的字越细致,特别是显示那些笔划比较多的字,效果越好。
4 q4 z( ]. B; Z/ {
. K# b& k8 R0 W! m# @9 j8 `下面进入GF字体的世界,GF的字体扩展名是.LAF,都打包存储于Data000.LAB文件中。先分析一下LAF的文件格式,然后再讨论如何在字库中加入中文。LAF格式由文件头、字体索引表、字体偏移量表、字体点阵四部分组成。 - K& y8 D1 ^9 r6 \, h5 _
8 ^: Q$ `& K1 c. [! @- [
1.  文件头(32字节) 4 {9 M) }0 u+ A" w: K( Z0 e9 M

0 \; p) @! c8 d9 ]# j! V! [! L" }字段
' W  T- [7 ]3 F( g 数据长度 , X) X+ T5 D: [( t1 [* k
描述 " t/ H6 v9 Q) h; u

& B5 s$ l3 l" r7 m7 {5 J. d+ VCharnum
" W- D4 a# o2 N  \  D$ T) B Long(4字节) 4 E# _" Q8 I8 W. s8 [
字库中字体个数 , \" R: H' g4 ]7 X( F* e; l7 z5 o

/ n4 V, u" ?; [9 n8 A* H" |* {fontsize
- |& V! C8 A" Z. t) u" U! D Long(4字节) ; J5 u  ^# f+ Y0 E+ C2 C
字体点阵部分的数据长度
9 \+ @2 g9 {( i
/ _- t: N  `$ h# U* R8 qMaxWidth
/ {- p3 q# {) A Long(4字节)
2 k+ M# l* I5 w. I( K! ] 字体最大宽度
) s: j; i7 K7 ]7 \' i) m
0 f4 {! L3 p; ^1 v5 d, o) bMaxHeight
% j9 L: ~# \7 T( ?0 ^$ _2 W, R5 s Long(4字节) 5 Z% z, `7 ~/ h2 O) d
字体最大高度
: @. j0 \' A# s' Y & S# W& n$ ]$ q. ~
Unknown , N, `$ `: b0 c; y+ I: A5 z/ i
Long(8字节) ! W5 j: ?% I4 [, r+ y+ N
未知 # u# z. E( h$ P; j; [, t

- f, M" L* W6 J, M0 JFirstChar 5 u. E/ d- Z9 `
Long(4字节) " B! T4 _2 V# l  }! C& \6 K/ J
第一个字符编码
( C5 U, z9 [9 `6 h7 S 4 @+ Q. `, n: ]/ J6 M: J$ `
LastChar
- h/ k+ r1 Z, x# ~6 e  k/ j Long(4字节)
& U  B, o6 H" u1 D% O3 }$ x5 } 最后一个字符编码
( [. q' M- R/ u2 d: j$ t1 ] . t& v  g; [, R$ W# Y- r8 T
; {2 v' p* u- @! Z0 x5 h
  ) ]0 ]2 A  F: }0 w' f

& j/ C. p7 |6 P& s2.  字体索引表
( x/ O3 L9 B0 H7 S# C( a! x7 V! ~0 n  b' d! g; A
与字体编码范围相对应,每个双字节保存一个字模在偏移量表中的偏移量。如GF的英文字库是显示ASCII码表中0-FF的字符,所以有256个字模,字体索引表有256*2 =512字节。保存内容为这256个字模在字体偏移量表中的偏移量
! {5 e% {5 c+ k- V  e5 W" t" [2 c4 Z( H9 L+ p2 ^; @! d
3.  字体偏移量表(与字体个数一一对应) 3 @: i2 Y2 u3 k5 e4 }

6 L1 z9 n* U3 ^1 z字段 + R7 U: |: l" w
数据长度
1 C; G. R# i( h4 v6 {% \( A" ^ 描述 # X: l: P2 E: K& r7 `' ^
2 T3 n2 J- A) b% G( Y
Offset 3 @( w+ S- K* U- P) X1 X$ D, F
Long(4字节) 8 v# G0 f0 Y9 Q( W5 w
此字模相对字体点阵的偏移量 0 G0 U& U: _1 q7 D) T$ j

/ D- s+ |% z. ^6 U' EUnknown
# [* p0 F2 u* n  y2 r1 L% M9 e' ` Long(4字节)
) K; Y: A" n% D/ j+ B' J 未知 * `. }5 k- Z' b4 G9 y
- G7 o* q" J) E: f, ^6 a
Width 7 x' `9 _, ]4 P
Long(4字节)
4 T: ?- W% A4 S 字模宽度
0 G7 x; C& ]  E; }# \" _6 F4 G: b
9 z2 [% w- E; _  lHeight 7 Z- s+ E- F! ^7 t. i
Long(4字节) * B* M) Q6 J3 D" g' M
字模高度 1 R; X0 e2 j, j# h: r1 t# B5 z

$ K" b, j: l. K" K) V/ i/ R4 @- F- U4 g8 s
  " b$ Y! c$ x2 N
3 W5 g7 N1 E3 K! Q0 P/ E5 b
4.  字体点阵 ( M0 `( A$ ?1 i; {3 H/ |
5 T( x$ Z0 G2 m. D' }7 [
保存字体点阵。字体点阵的保存顺序是,从左到右,从上到下。0代表无点,ff代表有点。(这是GF点阵与一般字体点阵的区别,一般字体点阵一个二进制位的1代表一个点,但是GF的字库0xFF才代表一个点)。 ( ]- ~( j7 T; [) N/ L8 P# W. \7 g
1 ?9 \' W; Q+ h0 O# l5 d) `7 `
现在举一个GF中的点阵的例子,下图是GF中汉字“选”的点阵,可以基本看出字形吧,每个汉字都要做成这样的点阵加入到字库中去。 9 q( c( x& `  C) p
- H8 n# A+ V2 k, B& w

$ ^% G/ {9 h* x; R; _    s& l3 D" S) q2 T
* s1 W* r  I: r( B
现在举一个例子,说明GF程序如何显示一个英文字母N。(N的ASCII码是0x4E) 6 X8 e/ `! K6 A& z  E# |

6 d9 q  t% U! p  [+ G1.  在字体索引表中找到字模在偏移量表中的偏移量。读文件32+4E*2 = 0xBC处的双字,得到偏移量4E。 * |; Z: ?$ `% @
, q; q6 T( R) f/ i3 h: a5 S
2.  在字体偏移量表中得到字体点阵的偏移量。读文件32+512+4E*16 = 0x700处得到字体点阵的偏移量0x17c0,再读0x708h得到字体N的宽0x0A,再读0x70ch处得到字体N的高0x0C。 % h/ z2 b' q* F) s; y" l( U5 u

$ H4 h1 ]  f- y! E3.  读字体点阵显示字符N。字体点阵的首地址为16*256+512+32 = 0x1220H。字体N的点阵部分是在文件0x1220H+0x17c0H到0x1220H+0x17c0H+0D*0A之间。 " |2 k1 ]+ o" ^! Y, I: v7 e

- X0 Z) z6 D5 `; t, T; w) {1 D  
* ]) J. F/ U$ v/ @
4 Y0 y" @- u% R1 p# {+ c  ?9 [+ Z4 i汉字编码GB2312-80简介 - o7 x) X# ?" X* E- s! A7 c
" N* \% Z! |% T1 P
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
, v0 ~4 E* A' }2 k$ V/ |# R
/ r" s0 j1 e: ~  GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。 : d* p5 [0 I9 j2 U6 Q' t$ ^8 g

2 m# T; d: c& {6 S, S1 @: m  GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。 , T9 ?# B7 E1 @

% x. P# i1 C) M2 J$ SGB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。 8 H1 Q, b9 u/ v1 k( `+ F
/ W; h% m! G; i5 {2 b
改造字库 6 Z9 J0 A: g9 c" o7 f  {+ [5 a5 Y. A

7 |6 e" }$ A8 ]) |我们现在要做的就是将GB2312中的6763个汉字加入到GF的字库中去。汉字点阵定为16*16。因为游戏中仍要部分内容要以英文方式显示,所以我们加入汉字并不应该破坏原有的英文点阵字库,而是应该在英文字库尾部追加这6763个汉字。 / T! {  M+ O" X

- w8 i& \; z3 t8 p1.  首先要修改文件头部分,每个字段都要做相应调整。
# F. c2 _7 s) b7 N: b8 X
- h% U& a* Y" V. Q- I2.  由于汉字编码范围是2121H-777EH,所以字体索引表至少要扩大为777E*2个字节。索引表的内容前512字节为原始的英文字体索引表,应该保留。在此之后,凡遇到字体索引表中GB2312汉字编码处是汉字的位置,添加汉字在字体偏移量表中的偏移量。汉字偏移量应该从0x100开始(前256是英文字库)
1 E- o# ]% e. v9 P( ?1 Q
/ s: K+ |4 }$ K! U  L- B+ V3.  重建字体偏移量表,将6763个汉字在字体点阵的偏移量、汉字宽0x10,汉字高0x10写入。 5 c  R2 r, d" k# n/ p
" k2 h3 |0 x1 F0 |! Y9 `( E* N* }* |
4.  将6763个汉字的点阵追加到原来英文点阵的尾部。
, i5 l1 ^- c$ s" F# J, v6 j7 {3 d% R& }. f
经过以上4部,字库改造完毕。虽然修改只有4部分,但是每部分都涉及到各种偏移量的计算,多字节高低位的读取等、文件头的再修改等步骤,代码实现起来非常麻烦,稍有不甚就会失败,甚至导致GF运行时直接崩溃,调试时需要特别的耐心才行。
; z0 a% ^8 D  r8 q( q" _7 H3 x" i1 m0 A: a
    在生成新的字库后,把新字库覆盖掉原来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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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