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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。9 O- @0 m+ L8 `4 ~1 z" e& O( z
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
. [, D/ [% b% C) x; `* a经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。" X$ |* M0 O1 ~. n

1 @7 e# l' t0 D. A  {' U经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
: L- z# ~7 {9 K. _其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。9 f3 w+ p7 H% y
FONTE3.SPR里边只有放了单字节的英文字符。
$ K9 R+ F+ \' K; S; v目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
8 m6 {8 {& ~, L  _; |5 @5 C! ~当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。7 u1 X$ }8 n6 R3 G5 t/ T" B

! E2 T+ `) [' I- _9 S
8 ]& j. f' H  I) |+ c6 A单个字符显示到画面上的代码如下1 t2 I! T) m( p3 A4 h- [) U. m( K
  1. // Display Font& l$ I" h1 V, e$ z' \/ Q' h
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    1 z- w+ U# V$ w& ~, R) c
  3.         const byte *spriteDataP = spriteData + 3;
      u& \2 ?: Q) U3 I1 \
  4.         for (int i = characterIndex; i; --i)  y. z" ~8 W1 P9 d8 {+ Y
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    ) g5 ^$ `' c4 z( W
  6. * z) M$ ]% T+ r8 O$ `5 F0 p4 w
  7.         int spriteWidth = 0;
    ( q, [* U5 v/ B) d* E
  8.         int spriteHeight = 0;
    ) t3 T% z! R& ?: s, n
  9.         const byte *spriteSizeP = spriteDataP + 4;: S2 g- ]& B/ r0 Z
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);1 \; j  s+ [$ u+ f0 ^: C
  11.         spriteSizeP += 2;9 t" o& i! ~6 u# h* s6 b
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);
    * e# l- k4 K2 r9 v* Q, H2 `
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    8 s/ G) m* y3 Q$ \- r- R. q+ N
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    % q$ @; ]- E. S, O! y
  15.         _width = spriteWidth;
    $ d- A$ u% F0 S8 p/ j
  16. ) N+ b% e0 A  n9 f! c3 O
  17.         int yCtr;
    1 j2 Q' f: H( M6 g* n* q$ E  K
  18.         do {
    5 j+ g( Y% j6 ~9 v5 R: p
  19.                 yCtr = spriteHeight;
    2 `5 [$ W: `+ T7 ?) o2 n0 p# @
  20.                 byte *destLineP = destP;/ N/ u5 M4 t. F' m( ]8 S  M6 q
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    ' y3 B- f) S+ a5 E
  22.                         byte destByte = *spritePixelsP;
      }0 n+ c: S. l2 |$ v
  23.                         if (*spritePixelsP) {
    2 W2 C3 u7 z4 ~( K% c  h
  24.                                 if (destByte == 252)
    . x& P' U0 D( T
  25.                                         destByte = color;; D# d  y" @+ E8 Y
  26.                                 *destP = destByte;
    $ |3 O! X! z' \8 q$ |( J
  27.                         }' w9 K# U1 g1 e$ ~7 p3 l( ^& m* L- @
  28. 4 S2 p5 O4 c. G# l- |; j4 C
  29.                         ++destP;
    0 j5 E# k" C" h% [
  30.                         ++spritePixelsP;
    6 Q- `; T2 E" n! Q
  31.                 }
    ; z& c! y+ K2 j5 ~- ?+ A
  32.                 destP = _lineNbr2 + destLineP;
    / [, X+ }+ I7 H" y
  33.                 spriteHeight = yCtr - 1;# e0 ^& ?7 ]" P) E) L2 g5 v+ z
  34.         } while (yCtr != 1);
    9 F' w# @! E  P7 W8 R0 L
  35. }
复制代码

$ D+ ]" ], J/ j" \0 ^1 J, g
2 S- a0 ^% W4 ~/ q0 Q- 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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