这个游戏的字库文件保存在游戏的SYSTEM目录下。
, L P* S7 y- ^( }# S6 P8 u4 ]我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。, g ?! i: v5 b, B! L0 I9 N/ y
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
) D8 e+ w9 K- w1 o
+ U! b. {- ~+ v. L& L% W经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
# t5 @. _0 n- l q其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
" H3 ^4 u) K) o% {9 J2 Z' `FONTE3.SPR里边只有放了单字节的英文字符。
$ v) R- N, J! n6 X% F- v; e' o目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,6 H ^8 w. p; `: B
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
2 ^; [/ e0 O- f" L- k3 e( ]- { b) c& s! y' x C4 R
: ]! Z9 m9 [ K+ o6 K) v
单个字符显示到画面上的代码如下
! Q, {, D# O0 z* `* }, Z0 H P% h1 O- // Display Font
! Z& Z# h$ O" J - void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {2 |. n" f; q i; C& [( u
- const byte *spriteDataP = spriteData + 3;+ d/ B$ i+ n+ W3 T2 a' ^! P" f& a
- for (int i = characterIndex; i; --i)
$ E% |; K! i: D2 K+ V+ v - spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
, q( h4 F1 L9 \5 W2 G4 ^1 N8 k - ' X7 z; q0 N1 q) @% I! ]
- int spriteWidth = 0;
! f. y5 C. C# s v - int spriteHeight = 0;
2 S$ Z+ Q0 m3 [& P) y$ C7 e) V( v - const byte *spriteSizeP = spriteDataP + 4;
/ _$ j- c6 X' ^+ O3 V* ^# f - spriteWidth = READ_LE_INT16(spriteSizeP);
7 Z! u- H" h# W2 l3 K8 K! c - spriteSizeP += 2;& p! W3 H* l t0 L1 ^! ?
- spriteHeight = READ_LE_INT16(spriteSizeP);* L" A% u1 n+ I2 B" U% \
- const byte *spritePixelsP = spriteSizeP + 10;$ ^# l5 r- M- F1 M, T m
- byte *destP = surface + xp + _lineNbr2 * yp;
( U; q6 w" d! y0 X - _width = spriteWidth;
4 E- U/ G* Y' B5 e
6 c& `/ l! h- ^- int yCtr;
9 k- Z4 O' S; E) D9 R# N - do {
. y. G5 o: |2 w D+ Z Y5 O - yCtr = spriteHeight;
5 b' a* e ]" R6 [1 { M - byte *destLineP = destP;* d# H3 M4 L2 g; L$ l" y/ j, @
- for (int xCtr = spriteWidth; xCtr; xCtr--) {% J( L, _+ s4 S/ M! Z/ ^) O3 J- k
- byte destByte = *spritePixelsP;! M C5 H) |3 |2 Z) n
- if (*spritePixelsP) {7 z+ ^% p/ v, u1 S, K
- if (destByte == 252)
. t3 _0 [( X* S9 M+ I - destByte = color;& U1 j! G. c; @$ g. ^
- *destP = destByte;' L3 ^: K& N" |1 |; b
- }' l; E( O- Z- H+ u b
+ B2 z8 _9 g5 W" D/ B- ++destP;# i* N- c' X0 M/ U* d; D
- ++spritePixelsP;% O- k& i+ j! c3 z) K. |
- }
- {+ p: t( L, D, | - destP = _lineNbr2 + destLineP;4 I) b. y8 E; y" N- A2 n
- spriteHeight = yCtr - 1;3 i& Q t! @! K0 v0 X$ J4 }
- } while (yCtr != 1);' @) K5 @, g" m
- }
复制代码 6 b ]2 r0 X4 Z; i" _
7 c4 ?, q1 a$ W& |: ?* e5 H |