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

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

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

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

跳转到指定楼层
楼主
发表于 2023-8-12 08:53 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。$ U$ f# r' n: T7 A7 w! o# p
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
5 E; ~* d4 T  }9 o# P5 ^经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
$ o) t3 M4 ^" x$ D' {8 Z
& Z9 L9 _: z9 c5 M8 g/ p. k9 e' W经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。3 r" m! n2 Y" w, ]3 g1 V
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。2 P, ^$ m* Z4 h3 s. Y
FONTE3.SPR里边只有放了单字节的英文字符。
1 M/ K2 Y. a5 N目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库," B* _7 l* w: l1 G
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
3 o# Z8 x7 S; _- j$ q1 |$ J
6 _9 m6 O6 c" b- l8 ^" z) r6 _+ D, Y6 B! k
单个字符显示到画面上的代码如下
- P. |% ?7 {* ?) k" j' Q+ M
  1. // Display Font) y0 u) f8 v4 w. o( W6 p) z
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    1 m% \' a( J+ B
  3.         const byte *spriteDataP = spriteData + 3;- Y* w7 q7 |0 L" _
  4.         for (int i = characterIndex; i; --i)
    $ w0 }! ~/ H" G) ^7 |
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;( u* w& @! i4 c1 N  A! T! v! @: P

  6.   [& o9 E  t8 ]# @+ U* {! d+ ?
  7.         int spriteWidth = 0;
    % d) k8 Z- x. D6 y
  8.         int spriteHeight = 0;
    " s4 O7 `1 `0 w5 s
  9.         const byte *spriteSizeP = spriteDataP + 4;5 M* I1 B$ x& d0 B. @
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    4 f5 e8 N4 d" ~- r( y
  11.         spriteSizeP += 2;
    ; C% h9 {; ~6 W0 s
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);! t1 x7 d  F0 [, O5 y( a
  13.         const byte *spritePixelsP = spriteSizeP + 10;4 X4 ^: X" _9 u# p- q9 i
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    ) L. E' c: D7 ?9 s( U0 ]
  15.         _width = spriteWidth;
    : S- l9 ]' O8 W# r4 V

  16.   ]! |( C, |( i" G! g: R
  17.         int yCtr;$ B2 _. i5 z- r$ ^
  18.         do {
    # o* c% }! U  x3 J" b$ _, u
  19.                 yCtr = spriteHeight;
    % J1 X' V* n% \5 R9 F4 x
  20.                 byte *destLineP = destP;7 A0 E$ `1 F4 ^4 q$ R
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {. p0 m$ y( g/ t7 X4 x; Y# D+ H
  22.                         byte destByte = *spritePixelsP;
    $ J+ k4 Y* V" X: `
  23.                         if (*spritePixelsP) {; t/ H/ M: h8 F' `) L  ^% z9 r: e
  24.                                 if (destByte == 252)* G5 t# F4 U. l) F( R7 u9 j
  25.                                         destByte = color;9 W1 K( ?# z2 ~: K
  26.                                 *destP = destByte;
    9 w$ @% l2 a* {# Q% T, A3 n3 w# f
  27.                         }  r8 k2 k* |5 {

  28. 7 X; W/ n" \2 X+ V8 @9 V/ z8 b2 B+ T
  29.                         ++destP;
    % V0 j& I; d+ b* ~7 H
  30.                         ++spritePixelsP;
    # w7 Q8 X' _7 r; b* g! `: X, R/ [
  31.                 }
      E- d1 n- W5 ^7 ?
  32.                 destP = _lineNbr2 + destLineP;7 z6 O" v! K3 f
  33.                 spriteHeight = yCtr - 1;& L5 Q2 \  r! B& ~; ^7 u
  34.         } while (yCtr != 1);
    5 z/ }, V, H- O5 }' k
  35. }
复制代码
7 D8 _6 o# l* f( S2 q3 G
! M5 ]) v$ l6 r3 t2 E
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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