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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。
$ R+ O, m5 j/ `9 t; l" y! N我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
: y' n1 Y5 I% j$ a8 S& J3 j- O经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。0 Z2 r, ^% O0 l3 N6 K

$ v' N5 ~2 g& @! d7 O经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。1 F% j# e0 @4 d! h7 U; ]
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
0 V+ p4 \* e: n4 {FONTE3.SPR里边只有放了单字节的英文字符。
2 w6 h; e- V2 J& L目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
$ I$ ^! C- Q( N/ ^2 G% W* ?; J当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。( Z% s' ?: f- W

) C9 `% a1 H; [: ]$ C9 o: o$ g/ T5 @, Z
单个字符显示到画面上的代码如下
( o/ ?0 d. g- N5 s# q8 d! ?  G
  1. // Display Font
      D. t% @0 c  @6 D+ o# z
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    : t5 v8 o, W- [0 N
  3.         const byte *spriteDataP = spriteData + 3;
    ' P* {9 L7 }' z* B. v6 E: ?! |
  4.         for (int i = characterIndex; i; --i)
    5 M0 L! `% D' V
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    # \5 L; f: i# D- z$ E

  6. % @+ W. E: b% D
  7.         int spriteWidth = 0;
    , F2 l* }, e" e) v+ w9 b! h5 D
  8.         int spriteHeight = 0;
    1 f( a% e+ M: r+ _- M# Y7 @+ P! H" ]( M
  9.         const byte *spriteSizeP = spriteDataP + 4;- J8 k0 b7 n; O% H! t1 b+ y
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    ) N% H/ V  E; ]
  11.         spriteSizeP += 2;
    6 ^$ c: X/ z7 o4 ^/ {
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);" \2 z0 w; o5 v+ Y
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    # U- x" F" o- m2 e  t! X2 V+ P
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    ! |3 }  q# a1 ?1 n
  15.         _width = spriteWidth;- K/ ?& w8 X, c; b9 H
  16. 3 k! V- i8 t+ G5 ^
  17.         int yCtr;. ~7 x, Y6 H. C' I- L7 B; p
  18.         do {
    % M8 s) y2 k. v! N1 e' i
  19.                 yCtr = spriteHeight;
    ; y, ]8 |2 J& x# a+ `3 f! w% @3 \
  20.                 byte *destLineP = destP;/ w5 b" P  P+ d+ s
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {8 N- R7 F( f8 l
  22.                         byte destByte = *spritePixelsP;
    - g, ]! x. ~- z7 b/ [) ~3 p8 {) G
  23.                         if (*spritePixelsP) {
    . E3 v8 G4 m; }) C$ h
  24.                                 if (destByte == 252)9 L) o- L! E& D& C
  25.                                         destByte = color;
    1 N, A, _% i/ F0 o( k' a; J8 \
  26.                                 *destP = destByte;
    ; q1 Z$ G( i4 T( d' G4 v$ r
  27.                         }
    ; M7 v! O2 v9 H
  28. # Z( A5 k: ]; C8 l, c
  29.                         ++destP;4 _1 Q9 W$ _% t2 [
  30.                         ++spritePixelsP;. k, G7 _# Q$ l# g' V" R& e
  31.                 }8 p% f% Q9 l8 b0 `/ E
  32.                 destP = _lineNbr2 + destLineP;
    # W( T7 |& ?- ]* d0 m
  33.                 spriteHeight = yCtr - 1;+ B" m) E* Y6 F; W" Q! O
  34.         } while (yCtr != 1);
    - M; J  I9 \& e) }7 v( \# ~
  35. }
复制代码
- E! y: i1 J( W$ i: ~0 c  o
- r2 u8 ^: v' g( p5 }7 W
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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