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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。
) |. j1 R% D# n" x我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。. L: V3 J/ f3 p( I
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。1 h/ K! G6 {5 V: J; `
+ D" u% z' {% u6 g& c3 s
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。- D" y/ ?6 _; h9 |- l  b
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。# y6 W3 K/ p: l
FONTE3.SPR里边只有放了单字节的英文字符。
6 c  r1 g, q) O/ U. W# o; C) m目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
$ m, ^. q' M1 ~* D% x1 t当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
% W  f$ t( g0 f1 T, h/ q
7 X4 C4 i- g  R) d4 x* O9 i  i
  l% r% K! I& l/ I单个字符显示到画面上的代码如下/ V' S) ^3 G0 |( F- A+ a! w
  1. // Display Font
    " o2 l/ o% ^4 J
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {! t3 ^- Y$ m9 |7 m/ ]
  3.         const byte *spriteDataP = spriteData + 3;
    $ Q) K+ n% c, H. N% B
  4.         for (int i = characterIndex; i; --i)( I$ Q4 o0 b3 w; o- ^
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    + r- L' J; j0 D

  6. 4 q" _* B2 e, s. b
  7.         int spriteWidth = 0;' Z9 _# V. @# n" k) n9 i. X
  8.         int spriteHeight = 0;
    % L# {  F6 G, {6 L  \' W; D
  9.         const byte *spriteSizeP = spriteDataP + 4;
    * G: @) E5 b  A
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);/ s! o' }2 ~/ F; x+ m- e( B
  11.         spriteSizeP += 2;+ O: k1 g, u2 z: y. v9 e) @8 l
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);1 w) g# `9 r, U( |/ t
  13.         const byte *spritePixelsP = spriteSizeP + 10;+ G7 p2 X& e: ^
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    0 i; V& r: @! Z# G# Q5 i+ J  e5 s
  15.         _width = spriteWidth;9 Y' f' k% G! ~0 I

  16. 4 V: K5 K+ P0 F# ]% r
  17.         int yCtr;
    # q! ]9 x: t# H. e
  18.         do {7 \) w  [1 v0 ~+ u& B
  19.                 yCtr = spriteHeight;
    . R& k' R" X  ~4 i
  20.                 byte *destLineP = destP;: S. y! L, o+ h) |2 }$ l$ {  P/ P
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {6 g9 w0 Q: w' p8 a: U
  22.                         byte destByte = *spritePixelsP;
    9 ]& n, M; l9 E; f0 Q, o
  23.                         if (*spritePixelsP) {
    8 b; K' F7 u" k6 @2 D  g3 ?# S' N
  24.                                 if (destByte == 252)
    5 }, A; k( i# b. I: F' Y! o: w% L
  25.                                         destByte = color;
    ; M/ S9 g6 S( s
  26.                                 *destP = destByte;
    1 _& i4 N# B; s+ j' x) ^! T
  27.                         }
    . ^2 y/ Y% \2 Q2 r4 L  a  C

  28. 5 K3 F( A! d: Z; R- C. Y" E( y
  29.                         ++destP;+ i" Q2 V7 p- p- p1 e4 {
  30.                         ++spritePixelsP;4 ^9 j) G, K5 U- O
  31.                 }. x- e8 e8 S3 H4 Y6 X. C
  32.                 destP = _lineNbr2 + destLineP;
    + Z4 f8 S; T, Q
  33.                 spriteHeight = yCtr - 1;" @4 l7 p  j. D. M# x+ c3 |$ q; ?! d" z
  34.         } while (yCtr != 1);. @: u; ?9 s2 y' x! [( ?
  35. }
复制代码

1 f( P! `& V2 a" O  R3 n" h* a) V  k
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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