这个游戏的字库文件保存在游戏的SYSTEM目录下。. {4 m, f) \# r1 e$ h" w
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
1 k6 W8 n+ a2 k- q* f经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。' ]8 j; c x+ `* `0 I
/ S. n; ?9 Q @$ v( e$ Y
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
& u3 G- U7 ?; h# H& R其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。1 X3 w4 ?" H+ s) v9 G
FONTE3.SPR里边只有放了单字节的英文字符。
" g n* E$ l; S目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,4 y# Y0 w$ c# g% H, B. d' q
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。& v8 `$ M; I5 L' ]1 r9 n. a
& E6 G0 O' y& Y) G
/ ]. p: j0 u6 U+ a$ d1 \4 _( c# `单个字符显示到画面上的代码如下
/ p3 }$ l$ ?* h V. b) F* n- // Display Font& C7 u- F7 o0 O( ~ `5 Q/ A
- void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {/ v; x8 [& Y! o5 n. j. U$ D* w
- const byte *spriteDataP = spriteData + 3;
, y f* ]2 Y- a* k0 v+ Y& v6 ?1 C - for (int i = characterIndex; i; --i)1 ]) A) w% ~8 e- P6 S8 ]
- spriteDataP += READ_LE_UINT32(spriteDataP) + 16;- [) K! q; f: f* p2 p5 A
0 |7 R' V) v+ a$ P/ L* f/ L2 ~- int spriteWidth = 0;( S( |: Z! h. a
- int spriteHeight = 0;
: m G5 X* ?) K# m - const byte *spriteSizeP = spriteDataP + 4;
% r! b/ O: I+ `3 b6 K - spriteWidth = READ_LE_INT16(spriteSizeP);# z5 e" v% P* y
- spriteSizeP += 2;) u0 {+ t: R, D
- spriteHeight = READ_LE_INT16(spriteSizeP);% Z1 I1 ]$ T9 l5 v' U( y( J9 D
- const byte *spritePixelsP = spriteSizeP + 10;! @( \7 _; A* J* s0 Y
- byte *destP = surface + xp + _lineNbr2 * yp;
/ \; R/ a; e; y/ ~9 o0 q+ F - _width = spriteWidth;
+ ^- H0 l6 [/ R) a+ ~ - & q9 C. J# @- I% H& i
- int yCtr;
, G% n2 `: P U+ H) K - do {/ b* n: u$ \" F5 C7 D1 r- K
- yCtr = spriteHeight;
! P( F) y0 }: _; Q - byte *destLineP = destP;3 S& K/ A( w$ P) s
- for (int xCtr = spriteWidth; xCtr; xCtr--) {& \, g! q8 v |+ @5 i( S/ u5 G
- byte destByte = *spritePixelsP;& r) e5 o. q h0 ^0 l, j! n
- if (*spritePixelsP) {
. P/ J$ ?2 ?- R" }. U9 d4 E# r- n - if (destByte == 252)
; e& u! o n1 b) `( g$ B - destByte = color;
* z2 L2 M% D& v) e; ? }7 X - *destP = destByte;/ x& L! k+ q; ^
- }4 ~& l# M' E' ]0 L$ n- [
7 J, ~: t1 G& i( ?6 C& D( y- ++destP;
' P! m D% e; g - ++spritePixelsP;
0 I; S) v& l+ \1 f+ }$ d8 w - }2 F4 j! e, w' I* {& Q/ H
- destP = _lineNbr2 + destLineP;
! [" c) g. d4 Q; L- c7 n) {% e - spriteHeight = yCtr - 1;
0 _% y7 D$ X4 T7 |, U1 `' Q- r. S) b - } while (yCtr != 1);4 |4 h: u2 D& b2 B: G2 t
- }
复制代码
: M+ z/ m- j! Q6 |1 Z$ }( T! O, c. j) J$ q4 {
|