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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。
, x) d8 r- i: K. y$ }0 u我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
3 h0 g5 U+ c& H& n: C4 t2 G经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。" Y" Y& w- G+ H- O: u
  `8 J& M: X0 [: P+ [+ t' {5 B, w
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。' z$ Q3 m% \6 J9 S5 a  T/ l, I0 J
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。% U, |) X' B! Y  y! U$ e+ J
FONTE3.SPR里边只有放了单字节的英文字符。
- g2 ]5 N; y6 c+ w/ I! B- S; I目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,, K/ ~3 b& v) ^8 r6 @% w5 t' B7 D
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
; [$ O) ~2 P3 e* g3 O0 T! D7 P5 u& n7 g; m1 S) N+ S
. E6 J8 a* J8 c2 k
单个字符显示到画面上的代码如下
; m3 ?1 k; W2 f& _2 m: b1 g/ y% {
  1. // Display Font4 a3 Z' ]0 k' F$ ?( I/ b  q" S. ~
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    1 h) p9 ~) J" F
  3.         const byte *spriteDataP = spriteData + 3;8 s# O2 ?1 {6 x. u- |
  4.         for (int i = characterIndex; i; --i)
    # p( B; b  b$ r6 P
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    - Y! }( Y, e$ r6 K/ q9 r
  6. 1 X& P" ], ?" E; k$ O0 B
  7.         int spriteWidth = 0;
    + |% E+ u. t! O! z
  8.         int spriteHeight = 0;
    & X" L: u  y* ~' f  @7 W* o
  9.         const byte *spriteSizeP = spriteDataP + 4;+ }4 v4 K" o+ W. Y) [
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    6 [5 B' x; s/ v1 x% a: Y& R) L
  11.         spriteSizeP += 2;
    7 l/ Z+ ^$ A# b* R3 {
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);$ V, r+ d& A, Z9 _6 t4 x8 a, d
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    3 R. x5 l" f7 K* p. W& B- ?- v
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    ) p# E0 i4 H0 y, W6 j
  15.         _width = spriteWidth;" }5 m# N' x% c0 s; I0 ^
  16. ' L$ |3 x/ e0 H) Q
  17.         int yCtr;
    : _! A, T3 e0 P* a
  18.         do {$ i9 H" {5 F- ~7 G* R5 t# x
  19.                 yCtr = spriteHeight;2 ~* I: j+ ]  D
  20.                 byte *destLineP = destP;
    2 m) b$ l. B( J+ ^# }2 s: ^
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    " a9 |0 ]8 Q" h( ]  S
  22.                         byte destByte = *spritePixelsP;4 g& r) a  S9 ]" X2 r" Z
  23.                         if (*spritePixelsP) {+ ?' q5 k0 R" Q6 m9 ?
  24.                                 if (destByte == 252)
    9 x& |* f0 n7 X! N+ F+ S
  25.                                         destByte = color;- D5 S& `9 L6 w( A# O: w
  26.                                 *destP = destByte;
    , H+ b8 V9 |" k2 x1 @: `. `# [; E
  27.                         }
    0 }, }& Q, Q  i6 C- i
  28. % q, S- Y. W* f5 ?& a7 e) V
  29.                         ++destP;4 G8 r1 d7 b" w. c# s& x2 u  A
  30.                         ++spritePixelsP;
    1 n7 |# d, m& P$ O
  31.                 }, W# n- D& Q+ y4 Z. f0 o6 g
  32.                 destP = _lineNbr2 + destLineP;
    6 g7 _# q0 K. n: u) Y) e
  33.                 spriteHeight = yCtr - 1;
    7 p  z1 \) Y+ }0 d% J, Y9 L
  34.         } while (yCtr != 1);
    7 o5 ^7 E/ j; N& ?
  35. }
复制代码
% I5 j) Q7 R2 G6 K
7 e, i' R: K1 G" S
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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