冒险解谜游戏中文网 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* mFONTE3.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 I9 Q9 z  ]/ `5 S4 @7 d0 z

& R. ]+ C* c' X  y# }单个字符显示到画面上的代码如下; z5 j5 Z4 G4 }. d
  1. // Display Font
    ! v- X0 o$ F( D. b9 l) |- {
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {$ [- m5 ]2 S5 e. M: ~
  3.         const byte *spriteDataP = spriteData + 3;/ Z5 L& ]* T% Q( E
  4.         for (int i = characterIndex; i; --i)
    2 A5 M4 |+ [) e4 o) j- d! T2 m
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;' {5 ^. S2 }9 j# y0 P' E
  6. ; D1 W/ l: I; c5 y# h
  7.         int spriteWidth = 0;' U) c9 D/ ~' B
  8.         int spriteHeight = 0;
    / `, j( O9 S& j) @3 [
  9.         const byte *spriteSizeP = spriteDataP + 4;
    3 ~( g# u5 `- @' N1 l$ }
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);8 J- j" L, I& I$ M/ D' `: V3 F
  11.         spriteSizeP += 2;
    8 @; G$ |) ?) e( a& Z
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);% T& g: l4 a+ ?- U' Q
  13.         const byte *spritePixelsP = spriteSizeP + 10;& T9 P' ^1 w4 g( S9 a# @' o% T, ]) j* b
  14.         byte *destP = surface + xp + _lineNbr2 * yp;$ W9 ~( B* N6 o, o( O
  15.         _width = spriteWidth;
    - ]/ n/ e- _' k7 m8 C- @8 `
  16. - l$ p  D2 s5 u
  17.         int yCtr;0 d  L" j4 R( L8 B
  18.         do {5 K. j- i- x& e: ?2 `+ I# _+ T
  19.                 yCtr = spriteHeight;/ o: d4 z1 v6 e0 ~1 j
  20.                 byte *destLineP = destP;9 q5 _+ R9 Q6 m' ^2 S3 v! {& ^
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    + X0 _8 J; \- L
  22.                         byte destByte = *spritePixelsP;
    # r; D* _6 g; @1 O8 z5 G! V
  23.                         if (*spritePixelsP) {4 o& f# Z1 g; T! m& k8 @
  24.                                 if (destByte == 252)
      l9 ]$ g4 S7 E) y
  25.                                         destByte = color;7 z- y- b, [5 U) z+ j# b6 M
  26.                                 *destP = destByte;4 l0 G0 w! {/ B. H5 O4 Y9 A
  27.                         }2 V" o2 \2 \2 i7 H

  28. 0 `  x9 b8 e0 s+ d
  29.                         ++destP;
    8 j& [  [- a6 n1 }& d
  30.                         ++spritePixelsP;
    : v2 y7 x. Z7 c4 r4 g  q
  31.                 }
    8 N; |7 d+ m1 [6 k1 a
  32.                 destP = _lineNbr2 + destLineP;, c/ K. S0 c# O
  33.                 spriteHeight = yCtr - 1;
    & L& Q0 E2 b: p' U. X
  34.         } while (yCtr != 1);
    % h! d3 w$ ~$ Q
  35. }
复制代码
- o+ d% ?- V7 m9 R* ?* C# H) ]% }
; W  {; l: A) w





欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2