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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。5 z& ?& y! o2 r4 E0 |* o2 J
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。" ?, Z8 m/ x, k- @: f7 Y4 V+ Y
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。  f7 r0 f/ M5 @

# C/ ?! v* @3 D) x2 p* {# O) u经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
: p; o, S& V/ E& N. p其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
2 W5 {, c+ e! NFONTE3.SPR里边只有放了单字节的英文字符。
+ b9 K3 O5 ^9 Y$ M0 `! }( u目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
8 G  Y  M. T/ `# \3 J$ K当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。  }. a( T2 [- C
" K- J! E; y+ f1 ]+ g8 ]. r

' s% ]$ {" ~0 |单个字符显示到画面上的代码如下1 r: F# n% P7 |
  1. // Display Font5 A# J9 o9 b! B
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    0 p6 N+ {. \% ^/ N7 y% e9 n
  3.         const byte *spriteDataP = spriteData + 3;
    : V" J6 m! X4 b# p4 Q; U' p
  4.         for (int i = characterIndex; i; --i)
    3 Q0 Y! F1 S9 F9 T, E9 }2 z
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;. s3 U) o3 U+ y% A9 B
  6. & s8 I9 p# J0 u* @- W9 Q! K( d
  7.         int spriteWidth = 0;
    . o, f) z# T! V- J: L  @
  8.         int spriteHeight = 0;. b. q6 F; l# _
  9.         const byte *spriteSizeP = spriteDataP + 4;
    : y1 S0 D3 J% Z
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);7 [. q6 q* k* l! W1 z$ r, t
  11.         spriteSizeP += 2;" W* Q. a* e! t7 r) N
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);
    # }- v7 a" z& b7 b3 q; b
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    2 H  s6 W3 h* w( s( q  E9 w
  14.         byte *destP = surface + xp + _lineNbr2 * yp;) c: N0 G2 L6 s9 l
  15.         _width = spriteWidth;- V: M& g* q0 G
  16. % y2 b! K7 c# G: i1 I7 e0 v% r
  17.         int yCtr;0 W4 Z1 i. o5 G/ w7 I4 ^  s
  18.         do {  Q8 f5 w4 B6 E
  19.                 yCtr = spriteHeight;
    ; F8 F# V+ u0 o4 U, y/ B+ R7 A
  20.                 byte *destLineP = destP;
    6 R4 \0 X9 V/ d; K
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    7 K- q8 H, B6 K* Q7 u
  22.                         byte destByte = *spritePixelsP;  r5 @% a8 z, R" Y: p
  23.                         if (*spritePixelsP) {
    : |: ]3 p$ M6 \* x
  24.                                 if (destByte == 252)
    ) H# Z. |% n6 ~2 B
  25.                                         destByte = color;
    9 g, S4 ]% c. e4 g- \
  26.                                 *destP = destByte;
    ) i$ R* |1 _  U5 m* M
  27.                         }, J; E* }0 H! F1 }: M: ~. k% h  Y( }

  28.   L( e3 k/ B1 h/ {" q0 g
  29.                         ++destP;$ d9 v# s  Q% c4 g
  30.                         ++spritePixelsP;
    7 Z# ~+ l: q5 b
  31.                 }# m0 g  g) Q) P9 o
  32.                 destP = _lineNbr2 + destLineP;
    / `/ B- q7 A( n3 g" k& c
  33.                 spriteHeight = yCtr - 1;* @6 Z" u* Z0 p" C
  34.         } while (yCtr != 1);: k0 d; X" U/ I0 I
  35. }
复制代码
7 v; m, n7 U( M$ Z, v
2 S0 Z! e, K* p- ~5 V
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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