这个游戏的字库文件保存在游戏的SYSTEM目录下。
- L# {! a; h& Y- N+ i5 H我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。# M- e& K3 L% I- r5 f% u! I
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
- Z- U2 m& S4 v
: J8 u' m8 I+ ?6 Z经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。, A' |7 h% j9 Q7 y) C
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
: @& [5 c3 x' v5 MFONTE3.SPR里边只有放了单字节的英文字符。+ f2 g- z" w, | d1 O# }* g
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
' S: s; r* Y6 \: X. ?8 L当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
7 w1 s3 \6 p; x5 e4 f, r, L. Y( e9 C
, R6 F7 M! M9 ]1 V. Y6 m7 w- M% G) h4 D: \& |3 I7 D5 B6 q; r
单个字符显示到画面上的代码如下
1 \2 e4 z" n5 n) O! @* L7 g" h; S- // Display Font; J0 v- m: j( s2 r3 a
- void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
6 B$ O" L, q3 Q! r( J2 Y - const byte *spriteDataP = spriteData + 3;
( ^, P0 u* ]0 m# v - for (int i = characterIndex; i; --i)" x. w* L7 e9 d' ?. A
- spriteDataP += READ_LE_UINT32(spriteDataP) + 16;- j9 b8 d. y. \, M: w0 q
- # I. W' W& s, b! N- V4 j
- int spriteWidth = 0;* S. R9 v! J, F, w
- int spriteHeight = 0;
: Y4 z) e, p0 S$ d9 q - const byte *spriteSizeP = spriteDataP + 4;
! N! J- N$ j$ ^ - spriteWidth = READ_LE_INT16(spriteSizeP);
' i5 m# A! Y7 I- J& |2 A5 ^ - spriteSizeP += 2;1 T8 r, n6 e4 L2 ]9 T8 ?& k5 D
- spriteHeight = READ_LE_INT16(spriteSizeP);2 M" s" c f1 J9 a/ W
- const byte *spritePixelsP = spriteSizeP + 10;
: Y4 u. D, ?3 h8 \ - byte *destP = surface + xp + _lineNbr2 * yp;* h! S( h2 F2 b( ^
- _width = spriteWidth;8 W; O6 `( R _: v) H- r3 l
+ N) }0 [8 k) ^/ i- int yCtr;; G7 g/ N, ^8 t. C
- do {" j3 L, ], W$ P) |% w$ d2 q1 }
- yCtr = spriteHeight;1 K. p% Z8 r: X" H
- byte *destLineP = destP;& b0 K$ _& T. L7 N+ s2 c2 B, a
- for (int xCtr = spriteWidth; xCtr; xCtr--) {
) g+ s I$ r! Y- D% M m0 j$ j+ s/ e - byte destByte = *spritePixelsP;
+ T9 ?9 |) B5 u! N - if (*spritePixelsP) {
; z9 y1 [2 Q3 l - if (destByte == 252)8 P% {8 ?) J' L; j# v
- destByte = color;0 l9 Y( `! {0 V& |( K- i( S
- *destP = destByte;
: X4 `5 g# H1 a - }
$ M( ^3 T& r4 c3 D( _
% w, C9 ~" u" x9 x- z- ++destP;; O9 S% _. I _. C* M8 X, J
- ++spritePixelsP;
% p3 N/ N% B- A6 t0 K7 q - }
9 _: K1 u3 P& `0 M3 A; o! d - destP = _lineNbr2 + destLineP;
9 V$ j1 Q7 ^, X5 J2 t) Q - spriteHeight = yCtr - 1;
& t9 ]5 L( X( K# C- n/ A8 P6 | - } while (yCtr != 1);0 _6 @+ l# {$ b* F# k
- }
复制代码 6 d% c4 ]% y. h
& B. w; o) j, n" [* g) | m |