冒险解谜游戏中文网 ChinaAVG
标题:
【Scummvm汉化 #1】Hopkins 国际刑警 #2 字库结构篇
[打印本页]
作者:
shane007
时间:
2023-8-12 08:53
标题:
【Scummvm汉化 #1】Hopkins 国际刑警 #2 字库结构篇
这个游戏的字库文件保存在游戏的SYSTEM目录下。
- ]6 m2 ]2 q" u2 [9 _
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
% c8 p' s8 ~" Y0 ^3 @2 b. M9 h' k
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
) Z; k* k: ?/ ^
& K& z) t! D1 q5 u, N ~
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
b( d' S3 S7 H' S: b
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
, ]( S3 p: x" f+ [- G7 _* B* m
FONTE3.SPR里边只有放了单字节的英文字符。
( I& w8 D' \) d4 u- v- z. ]( n
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
' s7 U5 ?, t* i/ e: @0 `
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
9 Z+ r4 D1 g9 A! W" Y6 Y8 \8 I
9 Q9 z ]/ `5 S4 @7 d0 z
& R. ]+ C* c' X y# }
单个字符显示到画面上的代码如下
; z5 j5 Z4 G4 }. d
// Display Font
! v- X0 o$ F( D. b9 l) |- {
void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
$ [- m5 ]2 S5 e. M: ~
const byte *spriteDataP = spriteData + 3;
/ Z5 L& ]* T% Q( E
for (int i = characterIndex; i; --i)
2 A5 M4 |+ [) e4 o) j- d! T2 m
spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
' {5 ^. S2 }9 j# y0 P' E
; D1 W/ l: I; c5 y# h
int spriteWidth = 0;
' U) c9 D/ ~' B
int spriteHeight = 0;
/ `, j( O9 S& j) @3 [
const byte *spriteSizeP = spriteDataP + 4;
3 ~( g# u5 `- @' N1 l$ }
spriteWidth = READ_LE_INT16(spriteSizeP);
8 J- j" L, I& I$ M/ D' `: V3 F
spriteSizeP += 2;
8 @; G$ |) ?) e( a& Z
spriteHeight = READ_LE_INT16(spriteSizeP);
% T& g: l4 a+ ?- U' Q
const byte *spritePixelsP = spriteSizeP + 10;
& T9 P' ^1 w4 g( S9 a# @' o% T, ]) j* b
byte *destP = surface + xp + _lineNbr2 * yp;
$ W9 ~( B* N6 o, o( O
_width = spriteWidth;
- ]/ n/ e- _' k7 m8 C- @8 `
- l$ p D2 s5 u
int yCtr;
0 d L" j4 R( L8 B
do {
5 K. j- i- x& e: ?2 `+ I# _+ T
yCtr = spriteHeight;
/ o: d4 z1 v6 e0 ~1 j
byte *destLineP = destP;
9 q5 _+ R9 Q6 m' ^2 S3 v! {& ^
for (int xCtr = spriteWidth; xCtr; xCtr--) {
+ X0 _8 J; \- L
byte destByte = *spritePixelsP;
# r; D* _6 g; @1 O8 z5 G! V
if (*spritePixelsP) {
4 o& f# Z1 g; T! m& k8 @
if (destByte == 252)
l9 ]$ g4 S7 E) y
destByte = color;
7 z- y- b, [5 U) z+ j# b6 M
*destP = destByte;
4 l0 G0 w! {/ B. H5 O4 Y9 A
}
2 V" o2 \2 \2 i7 H
0 ` x9 b8 e0 s+ d
++destP;
8 j& [ [- a6 n1 }& d
++spritePixelsP;
: v2 y7 x. Z7 c4 r4 g q
}
8 N; |7 d+ m1 [6 k1 a
destP = _lineNbr2 + destLineP;
, c/ K. S0 c# O
spriteHeight = yCtr - 1;
& L& Q0 E2 b: p' U. X
} while (yCtr != 1);
% h! d3 w$ ~$ Q
}
复制代码
- o+ d% ?- V7 m9 R* ?* C# H) ]% }
; W {; l: A) w
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2