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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。6 b* d& c6 s, G% B& R, w; A* J
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。( l+ i9 l, [! W: K" ~
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。' T: V, J) ]6 K6 V8 ?

1 V$ W1 E: `6 m+ b) M& ]0 Z2 T经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。: W& z- x" W3 x4 R7 W
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
6 z5 @' I' q$ F# E, QFONTE3.SPR里边只有放了单字节的英文字符。
: q& B# K' @0 T& i4 _' _+ l目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,& \3 P- S- L  B. W. J( ^2 k
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。' O  O7 j( o# W" }
0 {2 p. |$ L2 S. _0 @: k

% d; F. l2 w  `$ T; I- X单个字符显示到画面上的代码如下
1 {  O' R6 ~3 {+ a/ i
  1. // Display Font& a6 B$ z6 k8 Z" L$ @
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    3 w# T! y' `$ p9 n
  3.         const byte *spriteDataP = spriteData + 3;6 k9 z, F2 L# \6 n/ X
  4.         for (int i = characterIndex; i; --i)
    0 v0 {9 ~! p0 e4 q4 g9 n* M9 U* [
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;- u# ]9 W+ s' T0 \
  6. # e/ [, X5 J$ U) w8 g2 o# H; e
  7.         int spriteWidth = 0;
      y0 W/ P; ?7 |9 |
  8.         int spriteHeight = 0;& s6 f; e8 e# x2 G" q4 q
  9.         const byte *spriteSizeP = spriteDataP + 4;
    . I2 D9 a4 c- u( h
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);4 ~& _, N& |; a+ G; |1 G* r
  11.         spriteSizeP += 2;
    # e1 l( I) Y* ]  e7 n
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);7 Z( {. w; ^, M
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    . E, c! i( g7 i- O% ^: R
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    6 t6 x+ o9 q; N! g9 Q7 Q
  15.         _width = spriteWidth;4 A3 `- u/ q2 m0 S( n! Q* E  `' x$ M3 x

  16. $ w1 z2 V3 ^' S7 a. B/ w) v
  17.         int yCtr;) r0 e: t: B6 S8 r& b
  18.         do {
    3 U8 C0 Z% P5 P: h) _
  19.                 yCtr = spriteHeight;
    ) h$ p0 O" E% t2 Q9 i
  20.                 byte *destLineP = destP;
    & l/ B' n3 i, \7 W2 ~& P( Z* q
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    9 p3 j7 ^- _5 i" r; G. t( X
  22.                         byte destByte = *spritePixelsP;
    ! M0 ?8 E" I$ {8 V4 g# j
  23.                         if (*spritePixelsP) {2 f3 g& G4 t+ n0 \4 j4 A# [  x
  24.                                 if (destByte == 252)
    , G! X+ ]; e* s" Y8 \
  25.                                         destByte = color;
    0 y) G* _3 W- b( z% O6 |$ f
  26.                                 *destP = destByte;
      ]  N9 K8 C& z) F  {5 Q
  27.                         }" W7 A) L* `5 N8 s& f( o
  28. 4 F% O! Z8 _: x+ U3 O. k9 s3 K. W
  29.                         ++destP;2 F3 x! h, v! Y& G! U' ~
  30.                         ++spritePixelsP;
    ; s5 B+ X. P# i( B. L, _
  31.                 }! R$ s2 c7 E- R+ ?8 n4 Y) ~
  32.                 destP = _lineNbr2 + destLineP;
    9 K: L( E( j5 N1 i! z: \
  33.                 spriteHeight = yCtr - 1;( Y- \; d- ]5 I( e$ q4 i" ]) L! n" }1 @" s
  34.         } while (yCtr != 1);0 ~3 J: E4 x3 R% t  D; \  X
  35. }
复制代码

" q3 {" F; e; m5 ]  n+ J' c( r1 s/ y2 n5 ~4 W  Z7 [5 H
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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