这个游戏的字库文件保存在游戏的SYSTEM目录下。
8 y& K8 g- Z6 q& Y; k2 o; H我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。+ M8 T [+ e4 y; U M% Y0 d% z' L
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
( F* Z* F+ b- A7 @: D# F# k- \4 O( y' d8 V
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。9 B, r- o1 _; `6 C
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。6 f$ N8 s% q$ v( \
FONTE3.SPR里边只有放了单字节的英文字符。; E! U1 d2 ]$ |; n
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
+ V, u( Y* j, a& }当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。! A8 ]# {: G, h* h+ p- \" W& }. S
% W q- K+ T9 c( ]: f, D+ H: N$ g
) A# q0 d8 W2 c5 l5 t2 m R单个字符显示到画面上的代码如下
0 B. F. G1 P5 B( H* @4 h0 L9 m- // Display Font) d O$ E' Z- a. Q
- void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
. ~0 J$ X! c' C* O/ I9 n# N - const byte *spriteDataP = spriteData + 3;
& b, Q( j# E- h0 h: X - for (int i = characterIndex; i; --i)% F# p; w0 o1 [# H5 q/ ]7 C
- spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
& M' t' v% f% M. f& t8 \- U1 B9 d - - w/ [) o0 \& x7 i1 A$ j
- int spriteWidth = 0;. Y. p. ^$ F/ L* L; G
- int spriteHeight = 0;2 w7 A! _+ a9 s. k* } n% ?
- const byte *spriteSizeP = spriteDataP + 4;3 H# ]/ H7 p) P4 r2 Z1 ~; E Z
- spriteWidth = READ_LE_INT16(spriteSizeP);
$ ^/ r7 K0 o$ V/ t - spriteSizeP += 2;
* {* S4 i% w' A* P8 \8 K( O2 V# l - spriteHeight = READ_LE_INT16(spriteSizeP);7 h8 x* l& V; C5 e* I( J+ a- C* |
- const byte *spritePixelsP = spriteSizeP + 10;
# R" h( K# o, ]! z$ x - byte *destP = surface + xp + _lineNbr2 * yp;) l* a" M( i- S) I& S! I" E
- _width = spriteWidth;
: w+ X, F2 }2 T4 b8 f* W8 W% Z: |' z; W
- I% u O7 L$ E2 |; r( }) E" ^0 y- int yCtr;' N9 ~& ^5 k# N k' |$ [
- do {
& T# l. G& e6 @5 z! L4 G - yCtr = spriteHeight;
: K: i! Z4 }1 l. F% O - byte *destLineP = destP;- p: t& F D& m! w7 P5 w
- for (int xCtr = spriteWidth; xCtr; xCtr--) {+ [% u) x' Q2 T: Q, |' r0 Z& m
- byte destByte = *spritePixelsP;* Z! N8 C7 P: j
- if (*spritePixelsP) {
8 P# x/ B3 c( f - if (destByte == 252)
' c9 p6 T4 m, S, B# Y/ E - destByte = color;
6 q4 H7 l4 j6 C& L- `% }9 v8 b - *destP = destByte;
, ?8 [& ^4 b9 j9 j+ o8 l0 g - }
7 e* `, y% q! ~' W. q- F - 7 W. k" l) z( V R v- ^/ \3 l
- ++destP;
# _; ?: I# [4 V/ I8 t7 l1 k - ++spritePixelsP;- v' [& G0 s5 \$ P
- }2 d9 ?" r" T6 B# S9 E& ^6 W7 N. t
- destP = _lineNbr2 + destLineP;
' q+ Y) u% @; [ - spriteHeight = yCtr - 1;
! m: e. T; k% @! ^1 O B - } while (yCtr != 1);3 R/ D1 s ?; V
- }
复制代码 / R. K4 e# }9 w4 a
. h F$ J( W" P4 b* q8 R8 B+ M0 I1 f |