这个游戏的字库文件保存在游戏的SYSTEM目录下。
6 }6 o) C8 d* R9 O: t) ^我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
& h, x; X' V$ ], v4 B7 x6 F经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
" D( J) P- ], L9 J) b: G. O. P, ^7 t! }
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。, d2 E+ L3 L/ v% ^- p: [% n0 X1 ]
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
4 w& J$ }. ?4 Z. N) CFONTE3.SPR里边只有放了单字节的英文字符。% F7 H* R- |. ~' F4 L' c7 h% o8 Q
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
" `" D4 O" G; ]当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
C2 U, n0 ^3 M
" j1 d) c; u# _' w- z) N8 C8 a L0 F8 F- x n# Q$ p
单个字符显示到画面上的代码如下
( W4 e& `6 Y! Q9 O- // Display Font
. s3 p3 ~/ q9 t3 J7 v, k - void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
1 A+ |% E( G, [' { h3 J - const byte *spriteDataP = spriteData + 3;
# K9 p" `9 |& X% Q. V! w - for (int i = characterIndex; i; --i)
$ W6 B2 G `7 O! Y. ?( Y - spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
3 ]3 p+ `7 o# D# L1 q
9 e/ X# N+ [3 S7 E- int spriteWidth = 0;, ?, u# h4 N5 W& t- m7 B
- int spriteHeight = 0;+ z, D' p" g* }8 [. {" {9 m7 _
- const byte *spriteSizeP = spriteDataP + 4;
% k5 ]: ^: r$ a/ q% H/ I! T3 m3 G - spriteWidth = READ_LE_INT16(spriteSizeP);
1 }; B; g/ T4 @/ ^& Q - spriteSizeP += 2;
: |" L1 N8 a" K( B1 f! e" J - spriteHeight = READ_LE_INT16(spriteSizeP);
3 a. g3 L* W1 s: {$ L$ X - const byte *spritePixelsP = spriteSizeP + 10;
6 V) |+ X9 e j; B8 N. x1 L5 t - byte *destP = surface + xp + _lineNbr2 * yp;, }! g9 V- `0 t4 g! T: w; R& j
- _width = spriteWidth;
- Q# O6 _- i6 [/ r3 u7 M r - # @0 S( k( _. p: a5 L1 B
- int yCtr;/ o$ Y( l: |4 d) _8 x
- do {1 s/ J+ n( N8 k
- yCtr = spriteHeight;+ X8 n* R( O2 I" ~* c+ X
- byte *destLineP = destP;
* h* y- }4 I8 [1 ?* H/ Q$ f4 ` - for (int xCtr = spriteWidth; xCtr; xCtr--) {
( m* D. R6 j1 u+ @. c - byte destByte = *spritePixelsP;
% c" w+ v. S+ t7 Q1 s - if (*spritePixelsP) {
! z' C6 X: Y% H1 H - if (destByte == 252)/ N3 F/ c# M( q% k. j, L
- destByte = color;: I; R( ]% a* ^: k+ `) S7 I
- *destP = destByte;3 M2 U5 e6 |/ |; N# w+ d' i0 R7 a
- }
5 i# N" E$ M. w) F, |; S, m; k9 m - , r# X! F9 ~& m7 V7 F: `: l- m
- ++destP;. y' ?0 ]5 W8 \. O* V6 q
- ++spritePixelsP;
; W6 d- d, @, A - }
6 h0 K) X) F8 K7 R( @ - destP = _lineNbr2 + destLineP;
5 I; Y9 x/ ]2 w$ j - spriteHeight = yCtr - 1;% O4 |! L* e/ O, R5 T: ?+ t
- } while (yCtr != 1);3 L4 R, d( [6 T3 d0 S
- }
复制代码
3 F2 T; f/ z6 U- y8 X9 {! r3 K' ]4 L5 }* a7 ]9 {$ }& R7 }1 t
|