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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。
4 q4 z6 l$ w0 W我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。! }4 F% z& h9 x# I) A4 s$ w
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。$ A1 M3 x* [2 u1 D4 V) C3 M  W

" M- ]8 C! B* z, O! M( S/ A经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
: ^. }! T. m, `; @其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
& N+ t" @% K* ?FONTE3.SPR里边只有放了单字节的英文字符。
: Y) u) Q9 w6 G目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
! Q; f! B/ N* F' v3 A" u当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
$ y% r0 S$ Y0 i, }( M  h% w5 q
: N  W1 O; {" v3 y% {
" D8 U- U* U! t5 m9 p  A单个字符显示到画面上的代码如下& {' n' h; i! e
  1. // Display Font
    , W( E; `, \$ e5 F  E
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {1 i5 H/ I7 s' r/ U& O% G
  3.         const byte *spriteDataP = spriteData + 3;
    * _9 \3 d8 w4 C! o& y& X
  4.         for (int i = characterIndex; i; --i)
    ! R, n* j' [' V+ L( D" y6 Q- p
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;5 S  K/ }2 T) d
  6. ) a$ l- U- t/ L* o6 i6 K
  7.         int spriteWidth = 0;
    % ^1 u9 i2 T# r& o$ Q3 A/ ^' c$ d$ z
  8.         int spriteHeight = 0;
    7 b- @7 G: J9 `3 G# h* N& S
  9.         const byte *spriteSizeP = spriteDataP + 4;
    8 N- \& X/ @( J$ }3 K
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);& N5 p" p. E/ o: N" Z' x
  11.         spriteSizeP += 2;9 N0 f2 o% n6 C% ~
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);
    6 r0 I3 o- o+ ]6 q0 j2 A
  13.         const byte *spritePixelsP = spriteSizeP + 10;
      G- D" x- A5 m0 {! |
  14.         byte *destP = surface + xp + _lineNbr2 * yp;; V6 n- s4 q; i8 S
  15.         _width = spriteWidth;
    ) a2 M8 u3 G% Q

  16. 0 K/ {- l! a9 g8 j) k& |9 w
  17.         int yCtr;
    $ ]6 u& {  h( L& u5 s" ]
  18.         do {3 O* k% {9 v, ?2 s
  19.                 yCtr = spriteHeight;( a5 b: S1 U( z7 C
  20.                 byte *destLineP = destP;; b  f8 ]# z  e( L# b
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    ! W& W% G! y; j# M6 L
  22.                         byte destByte = *spritePixelsP;6 F# [" V# Z# g5 Q. f8 U
  23.                         if (*spritePixelsP) {
    3 E' u4 t9 P; Z7 P
  24.                                 if (destByte == 252)
    " a( r1 z$ a3 {# K0 }8 x9 R
  25.                                         destByte = color;
    1 c# S$ l1 `- C1 d, j) O
  26.                                 *destP = destByte;. x& u7 `3 X6 N
  27.                         }
    - M7 D8 T% ?! X: g( |

  28. 9 `# s( L% W6 a6 \* X8 d0 }
  29.                         ++destP;
    % ^) A- e7 K  Z$ s- Z
  30.                         ++spritePixelsP;
    $ x, `. n9 i$ }4 R" r0 }$ t
  31.                 }; z$ D/ Z( h% M: B7 e+ Q. V
  32.                 destP = _lineNbr2 + destLineP;
    ! T2 Y1 m# [, r# c4 S1 R" T
  33.                 spriteHeight = yCtr - 1;
    ; g; S, H/ R4 t% a( ?' I
  34.         } while (yCtr != 1);! z, w6 e5 U: q! S) D9 y4 e
  35. }
复制代码
8 O) E# w" \6 C, a& {5 }  w+ [

  h* @; \& o, \, H; T' |3 Z" `0 z5 N! d
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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