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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。
- L# {! a; h& Y- N+ i5 H我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。# M- e& K3 L% I- r5 f% u! I
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
- Z- U2 m& S4 v
: J8 u' m8 I+ ?6 Z经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。, A' |7 h% j9 Q7 y) C
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
: @& [5 c3 x' v5 MFONTE3.SPR里边只有放了单字节的英文字符。+ f2 g- z" w, |  d1 O# }* g
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
' S: s; r* Y6 \: X. ?8 L当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
7 w1 s3 \6 p; x5 e4 f, r, L. Y( e9 C
, R6 F7 M! M9 ]1 V. Y6 m7 w- M% G) h4 D: \& |3 I7 D5 B6 q; r
单个字符显示到画面上的代码如下
1 \2 e4 z" n5 n) O! @* L7 g" h; S
  1. // Display Font; J0 v- m: j( s2 r3 a
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    6 B$ O" L, q3 Q! r( J2 Y
  3.         const byte *spriteDataP = spriteData + 3;
    ( ^, P0 u* ]0 m# v
  4.         for (int i = characterIndex; i; --i)" x. w* L7 e9 d' ?. A
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;- j9 b8 d. y. \, M: w0 q
  6. # I. W' W& s, b! N- V4 j
  7.         int spriteWidth = 0;* S. R9 v! J, F, w
  8.         int spriteHeight = 0;
    : Y4 z) e, p0 S$ d9 q
  9.         const byte *spriteSizeP = spriteDataP + 4;
    ! N! J- N$ j$ ^
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    ' i5 m# A! Y7 I- J& |2 A5 ^
  11.         spriteSizeP += 2;1 T8 r, n6 e4 L2 ]9 T8 ?& k5 D
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);2 M" s" c  f1 J9 a/ W
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    : Y4 u. D, ?3 h8 \
  14.         byte *destP = surface + xp + _lineNbr2 * yp;* h! S( h2 F2 b( ^
  15.         _width = spriteWidth;8 W; O6 `( R  _: v) H- r3 l

  16. + N) }0 [8 k) ^/ i
  17.         int yCtr;; G7 g/ N, ^8 t. C
  18.         do {" j3 L, ], W$ P) |% w$ d2 q1 }
  19.                 yCtr = spriteHeight;1 K. p% Z8 r: X" H
  20.                 byte *destLineP = destP;& b0 K$ _& T. L7 N+ s2 c2 B, a
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    ) g+ s  I$ r! Y- D% M  m0 j$ j+ s/ e
  22.                         byte destByte = *spritePixelsP;
    + T9 ?9 |) B5 u! N
  23.                         if (*spritePixelsP) {
    ; z9 y1 [2 Q3 l
  24.                                 if (destByte == 252)8 P% {8 ?) J' L; j# v
  25.                                         destByte = color;0 l9 Y( `! {0 V& |( K- i( S
  26.                                 *destP = destByte;
    : X4 `5 g# H1 a
  27.                         }
    $ M( ^3 T& r4 c3 D( _

  28. % w, C9 ~" u" x9 x- z
  29.                         ++destP;; O9 S% _. I  _. C* M8 X, J
  30.                         ++spritePixelsP;
    % p3 N/ N% B- A6 t0 K7 q
  31.                 }
    9 _: K1 u3 P& `0 M3 A; o! d
  32.                 destP = _lineNbr2 + destLineP;
    9 V$ j1 Q7 ^, X5 J2 t) Q
  33.                 spriteHeight = yCtr - 1;
    & t9 ]5 L( X( K# C- n/ A8 P6 |
  34.         } while (yCtr != 1);0 _6 @+ l# {$ b* F# k
  35. }
复制代码
6 d% c4 ]% y. h

& B. w; o) j, n" [* g) |  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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