这个游戏的字库文件保存在游戏的SYSTEM目录下。
9 z5 V3 J5 r: d我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。0 ]0 X7 ^$ w5 M8 N! k+ T0 h% I* E
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
9 \: L. y2 ~- d& p" |3 P3 @
% o4 q! B& d3 D; z# F经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
% q, i/ u! H3 @) n其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
; F' o. O% b* {FONTE3.SPR里边只有放了单字节的英文字符。
% U2 R8 V) m; i) H8 R7 R, t8 [9 M目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,% Z& _ `. |" [- w
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
+ ^3 W9 E; R* r/ K5 w7 B- G: n
( s# \1 |8 o4 N* O+ Q: P* o8 |) o6 H$ L: [% l5 ?
单个字符显示到画面上的代码如下, _8 O8 I* S( Z
- // Display Font& j. n" v4 f* z b2 d3 S& G1 Z
- void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
/ w8 Y9 H E, |" v7 F, @" ` - const byte *spriteDataP = spriteData + 3;
\6 B: H# c: a8 S - for (int i = characterIndex; i; --i)
6 L6 f* x5 J. @1 e/ c' { - spriteDataP += READ_LE_UINT32(spriteDataP) + 16;+ l2 L" {4 Y0 S. H5 r: ~
- 1 ~- p( h# M t
- int spriteWidth = 0;
. k" b9 G3 i& U6 u: ^ C - int spriteHeight = 0;
) v4 o; L& `+ } - const byte *spriteSizeP = spriteDataP + 4;
" k+ d& N: M" l( Q, ?( K7 b - spriteWidth = READ_LE_INT16(spriteSizeP);6 Q0 H; @$ J) l' o" H
- spriteSizeP += 2;% |7 U8 s, H# ~$ P8 x
- spriteHeight = READ_LE_INT16(spriteSizeP);0 l: m8 E' }0 N6 F* ^# C3 g
- const byte *spritePixelsP = spriteSizeP + 10;
* s0 ]8 W7 ^) \& n ] - byte *destP = surface + xp + _lineNbr2 * yp;1 Y8 T5 \: V3 p5 z
- _width = spriteWidth;
& G& i% K& h/ w I6 }# g6 G - ; j a& @/ l( z* ^) X' q: k
- int yCtr;1 T/ e+ ^+ ^. j. ]# Y# L' y' g
- do {' k8 w# o O- i D4 c! [
- yCtr = spriteHeight;, ?- b& }7 i) C$ a$ i. Z' i
- byte *destLineP = destP;' D' M7 M+ f) ~9 S! \! n
- for (int xCtr = spriteWidth; xCtr; xCtr--) {& f, s7 N _+ k! J* t! @5 ?
- byte destByte = *spritePixelsP;
2 \$ x5 `9 n' B$ ]* W - if (*spritePixelsP) {
2 R- A2 N( T4 b - if (destByte == 252)
8 d! N9 N; j0 I# t) p/ f$ n - destByte = color;" `. i- ~# H" f+ S0 z) |2 o
- *destP = destByte;: i7 ]& F H+ U4 G7 B; M& d
- }+ B2 p0 R I0 h& c9 y3 K$ t
$ q- C$ e9 `# b/ t7 R! @- ++destP;
: ?9 Z$ y6 m# d! C& i/ C6 [' B - ++spritePixelsP;
Q7 v" t# Y* q# `" Q8 g - }/ m6 R( N0 K6 `2 S+ W; t
- destP = _lineNbr2 + destLineP;
: E9 U) l; {: A7 V. @ - spriteHeight = yCtr - 1;
0 I- I8 ]0 D0 @" y - } while (yCtr != 1);
2 ~- s( X6 c+ P9 A - }
复制代码
9 z% {* \8 ]2 q+ {# M. s! [2 P2 m. i! {5 W
|