这个游戏的字库文件保存在游戏的SYSTEM目录下。) O; `! W4 v6 }/ s
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
0 d& |$ Q$ c' x) f经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。1 ]) B* b( O5 Y* O V& R# L
- m: L& c# [$ \( R) Y/ t( h: i5 K经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。1 [& w) u! f: B) H: q
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
: H: E$ X+ R* `' o! ~& W6 ~FONTE3.SPR里边只有放了单字节的英文字符。
* Y8 G% r% @- ], {. r: X# a0 v* X目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
, E; v+ ]- c4 y; d当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。5 S# o- [6 @6 b( h0 ?" Y
g. _' [6 l/ V( B+ @
& y% ~. H N0 k' a
单个字符显示到画面上的代码如下* d' j7 h3 n" @# f
- // Display Font: Z! H7 `3 k* v0 V; `
- void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {- T' d3 _" V+ U- E
- const byte *spriteDataP = spriteData + 3;
7 ?1 n; i; L( ?8 ^* G - for (int i = characterIndex; i; --i)7 N; l( u2 L9 m2 p
- spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
& @" Q: q; C- x6 {; D
$ i n5 p! K, m+ t! U; `- int spriteWidth = 0;
+ ?3 p, N" g4 f, [7 B6 `, r4 s - int spriteHeight = 0;
5 @9 Y. I E$ X) j! { - const byte *spriteSizeP = spriteDataP + 4;/ Q# k3 s- ^1 P9 M, r
- spriteWidth = READ_LE_INT16(spriteSizeP);
8 z7 Y& a2 ] n6 D3 n3 ~) G4 Z - spriteSizeP += 2;( @. W4 _" G* Y) O7 j. S3 G' i1 ?
- spriteHeight = READ_LE_INT16(spriteSizeP);
: y% R* |# h( c7 l9 t% V: B - const byte *spritePixelsP = spriteSizeP + 10;) g6 N7 l7 [+ w: S
- byte *destP = surface + xp + _lineNbr2 * yp;" P3 g6 R! n8 Q7 u$ a9 Z# r
- _width = spriteWidth;
, ]3 `' e6 o: i2 w- g% }+ U
, d3 K- h% i' D1 x+ o! s2 A- int yCtr;" s5 G3 u2 A' t$ M _% M+ X
- do {- z- R2 E# z9 J0 z) K
- yCtr = spriteHeight;
3 a2 c" L) o2 m - byte *destLineP = destP;
6 A2 h" V \, H# A/ U - for (int xCtr = spriteWidth; xCtr; xCtr--) {
7 Y: A& b+ q. ]- D, i1 H1 Q - byte destByte = *spritePixelsP;
9 S! J ?& h8 u: r- @7 h - if (*spritePixelsP) {
6 o- g+ u9 G; [1 }9 }. l$ G - if (destByte == 252). n- n5 g( }! `6 @2 F- |, U
- destByte = color;
0 D% u( }. X* `) ~! J - *destP = destByte;5 _' m7 H; F9 m0 A
- }" S- C- C# E9 L+ x
- 6 i6 J2 |: D1 A! q/ Q- v8 R1 t
- ++destP;6 Q4 |1 }) L7 W, k( s
- ++spritePixelsP;4 d) K& w# j3 [. K a# v/ `
- }
# S+ Y4 G; s: z# x9 Q0 p4 @+ w - destP = _lineNbr2 + destLineP;
9 d; x8 r! Y* P G b - spriteHeight = yCtr - 1;
8 [) }9 _* }( i6 X/ s* ^ - } while (yCtr != 1);
: m! Q5 i3 Q/ R0 d. D - }
复制代码
4 D/ |$ b9 i. s% _8 ]$ A# @# y" T/ x' C, G2 {. K
|