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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。
8 y& K8 g- Z6 q& Y; k2 o; H我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。+ M8 T  [+ e4 y; U  M% Y0 d% z' L
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
( F* Z* F+ b- A7 @: D# F# k- \4 O( y' d8 V
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。9 B, r- o1 _; `6 C
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。6 f$ N8 s% q$ v( \
FONTE3.SPR里边只有放了单字节的英文字符。; E! U1 d2 ]$ |; n
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
+ V, u( Y* j, a& }当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。! A8 ]# {: G, h* h+ p- \" W& }. S
% W  q- K+ T9 c( ]: f, D+ H: N$ g

) A# q0 d8 W2 c5 l5 t2 m  R单个字符显示到画面上的代码如下
0 B. F. G1 P5 B( H* @4 h0 L9 m
  1. // Display Font) d  O$ E' Z- a. Q
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    . ~0 J$ X! c' C* O/ I9 n# N
  3.         const byte *spriteDataP = spriteData + 3;
    & b, Q( j# E- h0 h: X
  4.         for (int i = characterIndex; i; --i)% F# p; w0 o1 [# H5 q/ ]7 C
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    & M' t' v% f% M. f& t8 \- U1 B9 d
  6. - w/ [) o0 \& x7 i1 A$ j
  7.         int spriteWidth = 0;. Y. p. ^$ F/ L* L; G
  8.         int spriteHeight = 0;2 w7 A! _+ a9 s. k* }  n% ?
  9.         const byte *spriteSizeP = spriteDataP + 4;3 H# ]/ H7 p) P4 r2 Z1 ~; E  Z
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    $ ^/ r7 K0 o$ V/ t
  11.         spriteSizeP += 2;
    * {* S4 i% w' A* P8 \8 K( O2 V# l
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);7 h8 x* l& V; C5 e* I( J+ a- C* |
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    # R" h( K# o, ]! z$ x
  14.         byte *destP = surface + xp + _lineNbr2 * yp;) l* a" M( i- S) I& S! I" E
  15.         _width = spriteWidth;
    : w+ X, F2 }2 T4 b8 f* W8 W% Z: |' z; W

  16. - I% u  O7 L$ E2 |; r( }) E" ^0 y
  17.         int yCtr;' N9 ~& ^5 k# N  k' |$ [
  18.         do {
    & T# l. G& e6 @5 z! L4 G
  19.                 yCtr = spriteHeight;
    : K: i! Z4 }1 l. F% O
  20.                 byte *destLineP = destP;- p: t& F  D& m! w7 P5 w
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {+ [% u) x' Q2 T: Q, |' r0 Z& m
  22.                         byte destByte = *spritePixelsP;* Z! N8 C7 P: j
  23.                         if (*spritePixelsP) {
    8 P# x/ B3 c( f
  24.                                 if (destByte == 252)
    ' c9 p6 T4 m, S, B# Y/ E
  25.                                         destByte = color;
    6 q4 H7 l4 j6 C& L- `% }9 v8 b
  26.                                 *destP = destByte;
    , ?8 [& ^4 b9 j9 j+ o8 l0 g
  27.                         }
    7 e* `, y% q! ~' W. q- F
  28. 7 W. k" l) z( V  R  v- ^/ \3 l
  29.                         ++destP;
    # _; ?: I# [4 V/ I8 t7 l1 k
  30.                         ++spritePixelsP;- v' [& G0 s5 \$ P
  31.                 }2 d9 ?" r" T6 B# S9 E& ^6 W7 N. t
  32.                 destP = _lineNbr2 + destLineP;
    ' q+ Y) u% @; [
  33.                 spriteHeight = yCtr - 1;
    ! m: e. T; k% @! ^1 O  B
  34.         } while (yCtr != 1);3 R/ D1 s  ?; V
  35. }
复制代码
/ R. K4 e# }9 w4 a

. h  F$ J( W" P4 b* q8 R8 B+ M0 I1 f
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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