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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。# S+ I$ c7 F, t0 `
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
, ]: h0 G6 U) c; G! c经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
9 m+ |3 G: a$ u( M- \0 A/ E# N" ~- j% E8 |
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。- O6 R6 Q/ H+ d! N- E  d+ D
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
1 ?/ `/ O! q& q4 yFONTE3.SPR里边只有放了单字节的英文字符。% g; ?& W9 k/ a. R: N$ B3 _
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
+ E+ p$ D' N: T% n1 c) R* M当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。$ n7 U, T% @1 n( _8 o2 ^5 X) u2 U

1 `" D; m- {' `+ S8 }) ]( ]
, h; L" s) X9 T# b单个字符显示到画面上的代码如下
# ?$ z! ]$ E8 S  ~% \* Q7 y
  1. // Display Font
    ' I# D* t3 W* D8 G, I! [
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    6 z5 h* |' U$ k/ Q
  3.         const byte *spriteDataP = spriteData + 3;
    7 a* q7 {8 H/ \, P& P; R9 [3 u( ^. R
  4.         for (int i = characterIndex; i; --i)
    - N8 K1 [: _+ N5 D9 \# @
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    " I8 T7 p3 N8 p
  6. ' F# u7 |# ]6 t6 J, C
  7.         int spriteWidth = 0;) r" a5 s5 x. I/ g1 p/ I, x# w
  8.         int spriteHeight = 0;
    * A: v! W3 e+ A* b& l
  9.         const byte *spriteSizeP = spriteDataP + 4;6 I" c8 A. ^$ Y2 R
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);& W4 T8 \/ b7 q! V! T( H
  11.         spriteSizeP += 2;9 \+ p0 [% i* ]
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);
    & i# R+ D3 z% l  x* U" |+ O5 y
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    / ]) m# ]% R) K5 {, C
  14.         byte *destP = surface + xp + _lineNbr2 * yp;4 V+ S- N  w0 e
  15.         _width = spriteWidth;
    , }0 x: s4 `% [: V: g
  16.   F- \8 M! U; k6 }, C
  17.         int yCtr;  E4 x) b, B) r8 v
  18.         do {0 g" N: x/ }. o# z2 K
  19.                 yCtr = spriteHeight;
    7 v# X0 V* T( ?1 n; J
  20.                 byte *destLineP = destP;5 f! m0 z' b$ q; K2 g* N% c
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    # j  V- b% A* b4 u
  22.                         byte destByte = *spritePixelsP;
    9 j& L8 j* U! S+ z
  23.                         if (*spritePixelsP) {" D6 O" L! y6 j
  24.                                 if (destByte == 252)( ^7 K* N) z7 X8 J+ |; ^: D
  25.                                         destByte = color;& X& L; D) R/ A, q! d
  26.                                 *destP = destByte;" x3 d4 r. B  O7 u$ K% I
  27.                         }
    , \  H0 t$ S& r( ]2 Q- m/ |

  28. " e4 a# z% T, |6 V7 \7 ]! ]
  29.                         ++destP;+ F* P. B, \& y. j# P
  30.                         ++spritePixelsP;5 ]8 ?0 n; W+ Q$ b7 q, m
  31.                 }
    $ I: Y& W( s5 C6 B$ g, o/ z1 X- f; A
  32.                 destP = _lineNbr2 + destLineP;5 [/ ]3 R5 b& |% A# y' ~8 l! A
  33.                 spriteHeight = yCtr - 1;6 ]2 {! b; s) R7 v  P
  34.         } while (yCtr != 1);
      J! B4 f% j" I3 `0 D
  35. }
复制代码

% P( h/ r# C1 H( P  A6 k9 ^  b* H9 \  m
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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