这个游戏的字库文件保存在游戏的SYSTEM目录下。
" O8 s# @/ q. C8 H0 T' K+ s- D/ _我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
! D, s/ v$ A2 j# Y7 E" E经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。% f; b+ L# W# y# l5 j
9 d. K4 X! M. V; C, B& c经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
' E( m9 q- l9 i' W其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。' u5 Q3 A1 H& j3 J
FONTE3.SPR里边只有放了单字节的英文字符。0 ^* O- X( Y( ^- o
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,% i+ E" l' w5 `" [
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
$ E0 c( h3 M* v
/ T$ p% F/ O, `0 f, ]
9 O+ t, g' i% I# O单个字符显示到画面上的代码如下
5 n v/ R& I% [* }2 e- // Display Font
, u6 y3 }# ^ B9 m+ b1 w5 j' t - void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {- O5 Z4 j1 {3 {0 d) ~
- const byte *spriteDataP = spriteData + 3;3 w; p* B, y: f# K* G
- for (int i = characterIndex; i; --i)
+ Z. F9 v# l- Q; w( L6 _3 R - spriteDataP += READ_LE_UINT32(spriteDataP) + 16;0 y" K+ o1 V J8 X: y5 V Z
' q4 G' e! i0 h3 N: |1 _. d5 G- int spriteWidth = 0;
- z& r, c+ _' t/ e - int spriteHeight = 0;" `; _3 J5 Z; H; k6 N) v( ]
- const byte *spriteSizeP = spriteDataP + 4;
3 C/ V; V8 ^5 p# h, o3 | - spriteWidth = READ_LE_INT16(spriteSizeP);
* B& E5 u& c* u1 i - spriteSizeP += 2;
1 n9 R9 ?7 z% D# Y' H1 W% D, g) q. C. h5 C - spriteHeight = READ_LE_INT16(spriteSizeP);
; r ~# ^4 W! `$ i w% L0 u - const byte *spritePixelsP = spriteSizeP + 10;
& X* Q( X2 a% c7 r6 @% z" c- j4 ] - byte *destP = surface + xp + _lineNbr2 * yp;
7 ^5 ~3 W9 M; o% v; s2 N - _width = spriteWidth;* M1 B, l2 o: [+ T3 {, \3 ~. B. O
- ) M8 N3 K9 n3 f% o u9 X3 d
- int yCtr;! _1 N2 e9 w5 R" t
- do {/ t6 d r2 ?1 j# `! _0 @: k( Q( J
- yCtr = spriteHeight;0 ]' c2 X" u' E x( X
- byte *destLineP = destP;
+ S$ B, V7 {' u6 h3 m" {. O - for (int xCtr = spriteWidth; xCtr; xCtr--) {4 ~( m3 s; o: ^8 D* p
- byte destByte = *spritePixelsP;
2 U7 h7 s' o$ I. F) f. R - if (*spritePixelsP) {6 a. d2 ?0 H+ B5 Y
- if (destByte == 252)
! t& ?9 _6 E- g* J- i9 T8 g - destByte = color;4 \. V6 e# D, v, _1 N8 V+ v; N
- *destP = destByte; H+ O, h; i3 e; J5 J1 `
- }
% O2 {- y0 t/ |
% }3 j/ V% K1 B" m- ++destP;
" o; p; D7 O4 J7 S* e8 H, W - ++spritePixelsP;! w8 Y7 F7 C. h/ ?. z% `+ v! d# C
- }% w/ g( [9 b0 g4 F" m# s
- destP = _lineNbr2 + destLineP;: q y$ J8 o: e/ O
- spriteHeight = yCtr - 1;- x5 R; R' n V- g7 b l
- } while (yCtr != 1);
* j- c# F4 P' I - }
复制代码
V7 K3 T" F6 R
/ }1 T# @4 E8 o' j, [* U6 ] Z |