这个游戏的字库文件保存在游戏的SYSTEM目录下。4 D9 `' U! h$ m- O f9 b4 E4 r
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。# S/ S" p4 w, b) R
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。: u/ Y$ `4 [) C# D
4 x; C& m3 \- }7 f) r" e Y
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
/ e# J" t1 u' a7 b/ ^其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
S" [; O3 S- L9 X9 S; |7 zFONTE3.SPR里边只有放了单字节的英文字符。
0 ?: p7 Q+ S) _3 f$ Z目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,* ~! Q$ A, A6 s( |
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。4 `- z0 M' I* U' R
3 t3 @3 T/ F* z9 M
. y# r8 ]# I0 x+ G: ]; K0 x单个字符显示到画面上的代码如下
+ }' ~9 e+ Z" p4 s3 V; K% [5 d- // Display Font+ D# p& Y- _ v) d; K
- void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
/ H% T* ^" c* f( L4 t n - const byte *spriteDataP = spriteData + 3;
4 k' j- k/ G, |* V+ q+ Q - for (int i = characterIndex; i; --i)6 B W2 k: [5 `* P9 Z! L& N" c6 A
- spriteDataP += READ_LE_UINT32(spriteDataP) + 16;0 A1 D9 Z3 z+ F9 j5 G& B
- % F* O1 M$ n. T/ |1 ]
- int spriteWidth = 0;
/ m: |: G1 v) U4 J. n ]$ f0 A - int spriteHeight = 0;* [, G. g# U2 U5 E- e" j( l/ T
- const byte *spriteSizeP = spriteDataP + 4;, A) O- c8 P- X3 }+ f$ m- P6 p
- spriteWidth = READ_LE_INT16(spriteSizeP);
) |% [* q8 ^6 B) Q; U - spriteSizeP += 2;- f1 D! e* d! f; y
- spriteHeight = READ_LE_INT16(spriteSizeP);- z& F* q; m+ z: L
- const byte *spritePixelsP = spriteSizeP + 10;( j1 s4 L; c4 [2 t0 m. P5 n
- byte *destP = surface + xp + _lineNbr2 * yp;
3 _& ~8 t) G( c0 j - _width = spriteWidth;
; ]! D; J% A" r" L3 Z - 7 L4 E( h2 _: n& L
- int yCtr;
; @6 F( Z6 M5 ]7 E - do {
8 C M% \1 p% ~ - yCtr = spriteHeight;
+ O9 T2 ]" H5 N P, g, o - byte *destLineP = destP;- b) e, k6 Z- N5 u; w
- for (int xCtr = spriteWidth; xCtr; xCtr--) {
- l& C: [3 D" s& }4 j - byte destByte = *spritePixelsP;
0 N! O" s+ o7 m; H" G' z. ` - if (*spritePixelsP) {5 F9 C5 L3 ~: h% w' |
- if (destByte == 252). Y& k- a: D$ v9 s+ F: ?8 k+ x4 {3 U
- destByte = color;
! D! L! t/ F, u8 ?- a1 y - *destP = destByte;
" ]5 Z, \. H8 C/ R) m0 B( d - }) M2 v( j# N3 G5 M3 o1 h: v
5 x$ Z0 h) o4 n- |/ C- ++destP;
6 q. A8 P$ z# g7 @5 q- j5 m - ++spritePixelsP;
0 `: n( X! P6 _+ s- w - }
7 t; m+ o# b# {, W - destP = _lineNbr2 + destLineP;$ |; O4 Y" a/ b- t( b% r, c
- spriteHeight = yCtr - 1;
' y" c8 ^. P% a7 Y O - } while (yCtr != 1);
3 n- t, n$ F* V" e! t% i8 @1 ` - }
复制代码
0 E4 w+ }* @3 H% ^, \7 }
+ y+ M4 c( o g8 w# ^2 E |