这个游戏的字库文件保存在游戏的SYSTEM目录下。$ f+ } z/ T# Y( d. S1 o% |
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
0 ]& p$ Y) D" w8 L1 F; [) B4 J经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。, O0 r' X% V# X2 ]1 s- Y7 t
; M2 Y1 D. @+ _' T& k
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。, s* G2 L0 U' L
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。- j2 P5 `* x' f/ S$ d
FONTE3.SPR里边只有放了单字节的英文字符。
" W9 H0 W* A- J, @! z$ x目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,( } s3 ?$ v5 a+ }1 P% H0 [
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
8 h: W6 ^4 B% R* v
% z; a5 K2 c, S# d: F5 O* n. P* z1 }! I$ v) H, o. F# ?3 v
单个字符显示到画面上的代码如下1 N( P) I- q/ h' Q+ M6 N
- // Display Font& ~$ z) ~) _" K7 M
- void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {9 w( r, [+ d: V& a- i
- const byte *spriteDataP = spriteData + 3;$ |# E; r$ M- ?; m
- for (int i = characterIndex; i; --i)
1 D6 u1 G6 V# j - spriteDataP += READ_LE_UINT32(spriteDataP) + 16;8 M1 A: n" D1 j- r
8 [& {6 j* ?% ^1 F9 _- int spriteWidth = 0;7 M3 U3 A2 ]" D
- int spriteHeight = 0;" U# U/ z# A2 j$ G
- const byte *spriteSizeP = spriteDataP + 4;# ~- q# j- K, X1 Y8 U
- spriteWidth = READ_LE_INT16(spriteSizeP);- G0 W# l+ a" A2 `( \
- spriteSizeP += 2;
7 ^$ B# w4 D' Z0 @ - spriteHeight = READ_LE_INT16(spriteSizeP);. K' v! z8 V0 ?1 C, E' u! e: \
- const byte *spritePixelsP = spriteSizeP + 10;
/ R1 F. n% Q1 b8 v - byte *destP = surface + xp + _lineNbr2 * yp;9 {" O- O% J- g+ u
- _width = spriteWidth;/ V, m: Q/ A% y3 h
1 p, b! t* \( K$ f, ?5 U- }; A; L- H- int yCtr;
" v8 ?2 D( `9 I. y; ^+ a - do {& X! D+ q0 ]3 h
- yCtr = spriteHeight;
, w8 W; j0 w) \3 N! e |1 l - byte *destLineP = destP;
& W. |" Q0 r$ q! w1 Z5 h. M T - for (int xCtr = spriteWidth; xCtr; xCtr--) {
! @4 L( x& A% q& ` - byte destByte = *spritePixelsP;) ]/ M# g" g- i
- if (*spritePixelsP) {
{! v+ n! J$ N5 `1 I( s9 H8 _ - if (destByte == 252)! G' j7 o2 j q8 d- }& z
- destByte = color;# L0 v! z7 k# l6 p
- *destP = destByte;
# F7 X) K0 @. c3 o8 Q9 S - }% U u* g8 v( S3 r ~7 y& k2 u, r
- 0 M# e, f, F1 B8 {; R
- ++destP;
. E) n% B/ `0 ?: z z. P. g' z - ++spritePixelsP;1 E3 i5 w t' l# H3 l2 Q
- }' d3 G+ \! ^. }! U% h/ H
- destP = _lineNbr2 + destLineP;
6 N1 d8 u8 x4 ]4 ^& O/ j& _0 \" d$ N - spriteHeight = yCtr - 1;- K$ J/ `) i, q! T' ~3 `
- } while (yCtr != 1);
" W+ Q, M$ h4 A9 _& q" J4 ] - }
复制代码
8 K9 ]7 |4 U2 L1 J; b; ?2 C& s% }, f: A y
|