这个游戏的字库文件保存在游戏的SYSTEM目录下。
* v' `5 n+ ~0 l: @, y- {( I4 y0 r% k我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
! P: M8 C S, r0 `; h经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。# p+ C$ Q1 G {/ C# }( {" z% }' J
. R- b. C( T% c经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。& q; i* u: B% \( a% S. ^1 @; a
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。0 r' a; ], ~4 p5 t! o
FONTE3.SPR里边只有放了单字节的英文字符。5 `0 y- \& c) f) F* k U
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
4 d7 ^( G& p7 k1 N* R- R) ^6 z当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。( R9 i$ G/ V' N3 `5 u
; n2 J8 z+ V2 h( ?$ J: v6 w6 C: G- r
单个字符显示到画面上的代码如下6 I! c* f4 N. ~) H7 W1 Z; ?( H- k) z
- // Display Font
5 O. G$ l& H8 ] - void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {5 Z% _) N7 O3 }& \
- const byte *spriteDataP = spriteData + 3;
8 _* ^ V9 F8 L0 W- ?+ U& o% g, \ - for (int i = characterIndex; i; --i)
0 I+ r( ?- Y4 Y7 X( Z- ~/ w - spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
4 I: e& v1 R8 o5 b! w! B - 0 i6 t" d$ l2 t% b( h- r; O7 @
- int spriteWidth = 0;* l8 N0 z# y: i0 o
- int spriteHeight = 0;
; |- Q1 K/ S) G - const byte *spriteSizeP = spriteDataP + 4;9 b. n7 R3 z9 O9 [
- spriteWidth = READ_LE_INT16(spriteSizeP);
& K4 z( Q1 f7 K# ` - spriteSizeP += 2;
- |2 ~# R+ A; L; |4 ] - spriteHeight = READ_LE_INT16(spriteSizeP);
/ c4 ?2 l& }5 J - const byte *spritePixelsP = spriteSizeP + 10;
p7 W2 E6 c" r - byte *destP = surface + xp + _lineNbr2 * yp;' P& n. B! Q! M& O4 r" [
- _width = spriteWidth;/ z0 `/ S" s# D% a2 c0 r3 P, f
- 4 [7 n$ s0 C$ q S6 z. L* ?9 K4 _
- int yCtr;9 |( k, G5 q j8 V( D. | M: l
- do {
. Q+ D4 M7 G7 f& ?# }! s0 d9 t1 Y - yCtr = spriteHeight;/ g1 k* H& N$ p! M2 [9 ]- o. O
- byte *destLineP = destP;2 I. i) Q# }: S' a8 X& Q) w* I- X
- for (int xCtr = spriteWidth; xCtr; xCtr--) {
/ v' K9 c, V3 S3 }# V - byte destByte = *spritePixelsP;) R' H1 R% L+ j1 S4 \
- if (*spritePixelsP) {! v4 o+ }& a; O6 i
- if (destByte == 252)! Q- i$ n5 [" g" G: P
- destByte = color;# L( @8 J0 v) n2 l [9 K/ o. f) P
- *destP = destByte;/ e' I0 ^3 Q+ |
- }5 T( K5 f+ f3 Q' H# _* p
- + W v: [. B5 e
- ++destP;
% ~4 B5 M) }( H1 V - ++spritePixelsP;) C" a* d, o+ E) H8 i) k
- }
0 t7 c% f! t, M1 A3 c - destP = _lineNbr2 + destLineP;
. y# _8 d6 w2 O: K8 C5 o - spriteHeight = yCtr - 1;
. `$ G0 T u2 h# C) A+ ~" b4 e - } while (yCtr != 1);- P7 h0 @: h. p! u `* y
- }
复制代码 * O# v2 H6 {; V6 ?, t1 U' u
& P/ W$ [* [$ s. ]5 }. M |