设为首页收藏本站官方微博

其他 【Scummvm汉化 #1】Hopkins 国际刑警 #2 字库结构篇

[复制链接]
查看: 179|回复: 0
打印 上一主题 下一主题

[其他] 【Scummvm汉化 #1】Hopkins 国际刑警 #2 字库结构篇

跳转到指定楼层
楼主
发表于 2023-8-12 08:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【Scummvm汉化 #1】Hopkins 国际刑警 #2 字库结构篇

这个游戏的字库文件保存在游戏的SYSTEM目录下。  h: z/ J, w% \
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
8 H( s1 c, l; g; Q, m经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。; Z' B( a6 B& t; @; X5 T
$ C1 |# c# {7 ?  E# R* S2 P
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
% H/ o- E5 k' p6 l' P; y其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
' N8 \* o! [5 g- ~+ FFONTE3.SPR里边只有放了单字节的英文字符。( Y3 ]* ?9 ?# U7 D- w
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,1 A5 y& \1 \% _8 p3 l7 O0 D
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。& j- ]# S; s; l* D

8 N3 q1 F3 E* U: y
% u! y( \, H7 |9 X: y单个字符显示到画面上的代码如下' S) v! a6 p1 T' V' O
  1. // Display Font
    ! p: B6 b4 I4 H4 x+ e
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {/ [/ T7 r+ p* }3 t+ [$ V, B
  3.         const byte *spriteDataP = spriteData + 3;
    0 U1 O8 I* T7 j4 }' f0 y
  4.         for (int i = characterIndex; i; --i)
      b" Y6 b% I6 C# L! p4 P
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    / m6 l8 h& [- Z+ W" [3 [" @; w2 M

  6. , A8 @) ~- t3 G( P/ R* v
  7.         int spriteWidth = 0;, K+ z4 `7 U+ G# Q) b3 \
  8.         int spriteHeight = 0;
    ) [" X  L6 X# v$ w
  9.         const byte *spriteSizeP = spriteDataP + 4;9 m/ X5 i" P& g
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);! F7 {7 P0 u% _8 }' t
  11.         spriteSizeP += 2;
    , ?. E( u* e0 G% S
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);0 G( q/ n5 e9 c7 P
  13.         const byte *spritePixelsP = spriteSizeP + 10;8 |- L$ H. G9 R. R" i
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    % a( |) a+ e' \  W9 j7 q7 D
  15.         _width = spriteWidth;4 i& G4 Y. W* Z) a- r0 e3 g; @6 _
  16. 3 }% L. j8 r: d) n, y5 `
  17.         int yCtr;
    * e% I  K' ]4 m8 R# _8 G
  18.         do {
    4 \3 m7 u+ @7 s
  19.                 yCtr = spriteHeight;
    ) j; }# v% ]4 h0 V
  20.                 byte *destLineP = destP;6 e2 D' z# l/ u& `# T6 a
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {7 A. Q* j: o* R( \
  22.                         byte destByte = *spritePixelsP;
    $ W9 ^2 J9 {* J  o$ H
  23.                         if (*spritePixelsP) {
    : T" k) X" B! F7 T! F: k4 |) C  f/ b
  24.                                 if (destByte == 252)* g: J/ V' l1 G+ G  {3 ^3 F
  25.                                         destByte = color;
    : K) i7 U+ R3 \: F1 T, C
  26.                                 *destP = destByte;
    ( A- `* c1 x5 `! Z4 U2 n
  27.                         }5 y* F9 V3 e. B4 D
  28. . j+ T, d4 x* V/ i
  29.                         ++destP;( l: e0 R& n& u
  30.                         ++spritePixelsP;
    . [& {4 m# Q0 h% l, E; L8 E
  31.                 }! Y9 D( z2 d$ e% m8 C; D/ V
  32.                 destP = _lineNbr2 + destLineP;3 t) ?# s8 r! D& u9 s
  33.                 spriteHeight = yCtr - 1;, G0 `8 G; l' y$ U. [. W. \
  34.         } while (yCtr != 1);
    . O" |6 d( k( o: G
  35. }
复制代码

" `0 B' P" I3 K
. b8 t# d1 Z- m: a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表