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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。
, L  P* S7 y- ^( }# S6 P8 u4 ]我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。, g  ?! i: v5 b, B! L0 I9 N/ y
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
) D8 e+ w9 K- w1 o
+ U! b. {- ~+ v. L& L% W经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
# t5 @. _0 n- l  q其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
" H3 ^4 u) K) o% {9 J2 Z' `FONTE3.SPR里边只有放了单字节的英文字符。
$ v) R- N, J! n6 X% F- v; e' o目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,6 H  ^8 w. p; `: B
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
2 ^; [/ e0 O- f" L- k3 e( ]- {  b) c& s! y' x  C4 R
: ]! Z9 m9 [  K+ o6 K) v
单个字符显示到画面上的代码如下
! Q, {, D# O0 z* `* }, Z0 H  P% h1 O
  1. // Display Font
    ! Z& Z# h$ O" J
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {2 |. n" f; q  i; C& [( u
  3.         const byte *spriteDataP = spriteData + 3;+ d/ B$ i+ n+ W3 T2 a' ^! P" f& a
  4.         for (int i = characterIndex; i; --i)
    $ E% |; K! i: D2 K+ V+ v
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    , q( h4 F1 L9 \5 W2 G4 ^1 N8 k
  6. ' X7 z; q0 N1 q) @% I! ]
  7.         int spriteWidth = 0;
    ! f. y5 C. C# s  v
  8.         int spriteHeight = 0;
    2 S$ Z+ Q0 m3 [& P) y$ C7 e) V( v
  9.         const byte *spriteSizeP = spriteDataP + 4;
    / _$ j- c6 X' ^+ O3 V* ^# f
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    7 Z! u- H" h# W2 l3 K8 K! c
  11.         spriteSizeP += 2;& p! W3 H* l  t0 L1 ^! ?
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);* L" A% u1 n+ I2 B" U% \
  13.         const byte *spritePixelsP = spriteSizeP + 10;$ ^# l5 r- M- F1 M, T  m
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    ( U; q6 w" d! y0 X
  15.         _width = spriteWidth;
    4 E- U/ G* Y' B5 e

  16. 6 c& `/ l! h- ^
  17.         int yCtr;
    9 k- Z4 O' S; E) D9 R# N
  18.         do {
    . y. G5 o: |2 w  D+ Z  Y5 O
  19.                 yCtr = spriteHeight;
    5 b' a* e  ]" R6 [1 {  M
  20.                 byte *destLineP = destP;* d# H3 M4 L2 g; L$ l" y/ j, @
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {% J( L, _+ s4 S/ M! Z/ ^) O3 J- k
  22.                         byte destByte = *spritePixelsP;! M  C5 H) |3 |2 Z) n
  23.                         if (*spritePixelsP) {7 z+ ^% p/ v, u1 S, K
  24.                                 if (destByte == 252)
    . t3 _0 [( X* S9 M+ I
  25.                                         destByte = color;& U1 j! G. c; @$ g. ^
  26.                                 *destP = destByte;' L3 ^: K& N" |1 |; b
  27.                         }' l; E( O- Z- H+ u  b

  28. + B2 z8 _9 g5 W" D/ B
  29.                         ++destP;# i* N- c' X0 M/ U* d; D
  30.                         ++spritePixelsP;% O- k& i+ j! c3 z) K. |
  31.                 }
    - {+ p: t( L, D, |
  32.                 destP = _lineNbr2 + destLineP;4 I) b. y8 E; y" N- A2 n
  33.                 spriteHeight = yCtr - 1;3 i& Q  t! @! K0 v0 X$ J4 }
  34.         } while (yCtr != 1);' @) K5 @, g" m
  35. }
复制代码
6 b  ]2 r0 X4 Z; i" _

7 c4 ?, q1 a$ W& |: ?* e5 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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