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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。' A: g( [; w1 {
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
" @/ a' C( [0 I* l( @3 v- e. j经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
9 M8 q0 A# r5 j9 e! p
. B3 M3 w6 v- H' N7 D; M7 J& `经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。* w4 R6 a* z  X- \/ _+ O3 F
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
: y* S( g$ N. wFONTE3.SPR里边只有放了单字节的英文字符。
& i8 I1 ?4 ~& L% k8 J目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,, a: ~4 i3 N% Z) m, s+ \
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。. p- |* \: F8 x
% q3 M5 y7 W/ h* B2 m: k8 A
$ v/ J& r+ H* `2 N9 t* U
单个字符显示到画面上的代码如下
5 P7 a9 G. h! q: z6 T0 S$ P
  1. // Display Font1 A! O0 `3 |! }. Y) Z" h# E' {
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    ; C0 f" |6 ^0 l
  3.         const byte *spriteDataP = spriteData + 3;
    5 P; G) m! A, V7 r
  4.         for (int i = characterIndex; i; --i)6 w' i$ H: r3 E1 \* S; n
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    ! q: a; n+ m4 d" Y% f3 g

  6. 5 B1 Z# X! N! k, W+ C
  7.         int spriteWidth = 0;
    0 ~+ ^) j+ P7 y
  8.         int spriteHeight = 0;
    , s8 n3 t/ U4 M5 p2 t9 z4 b7 p
  9.         const byte *spriteSizeP = spriteDataP + 4;5 A7 w5 ~% ~; U! c& Z
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    - _( D* _6 [7 G0 r6 m: |
  11.         spriteSizeP += 2;5 |  o4 i5 {+ U# ^  N- r
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);
    . F+ j8 c0 e; B; g( F5 V% f8 S3 l
  13.         const byte *spritePixelsP = spriteSizeP + 10;: z7 D1 y% g7 T# e" o/ L9 J
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    + _  t0 d" y) R: u
  15.         _width = spriteWidth;0 I# ~9 P; ^1 }# Z/ r' M: Z4 y

  16. % y" Y0 E+ Z7 X" c( r- S4 n/ u
  17.         int yCtr;
    $ [0 q! n1 p; o, E) ~# E+ t
  18.         do {
    8 v$ E, W# D, d4 L% v4 h' v3 N
  19.                 yCtr = spriteHeight;$ Z& X: {5 `& W% a* R
  20.                 byte *destLineP = destP;! o6 r, [' F: r) k
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    # }7 D, [, `5 Z* Q! x* A4 v
  22.                         byte destByte = *spritePixelsP;- |3 [0 W5 h! {5 Z5 C* g
  23.                         if (*spritePixelsP) {* u  `+ g- d1 o: o! H8 K
  24.                                 if (destByte == 252)* y9 p/ l8 l/ ?  I' j& B) \( V
  25.                                         destByte = color;
    : R6 {' {, P& z! W
  26.                                 *destP = destByte;
    : ~/ {- l3 ^+ y1 q4 }% y$ l+ s0 z
  27.                         }
    2 L2 U" R" }1 l# b8 J- R

  28. - @4 X! `& X7 k8 G$ w' W8 U
  29.                         ++destP;
    2 d: b6 l1 ]4 z  s5 |
  30.                         ++spritePixelsP;
    1 P7 ~1 @% S  k7 u4 H
  31.                 }# f" [' N  M, W! t- n
  32.                 destP = _lineNbr2 + destLineP;; l: U3 l/ E+ ]# d) \
  33.                 spriteHeight = yCtr - 1;
    3 f$ G; A1 @- Y: F) |: v- I+ Q
  34.         } while (yCtr != 1);
    ! h( I6 G, u3 Q2 ^/ v2 W; z
  35. }
复制代码

9 M: V9 e+ m" b- d
9 L9 P% W' W; S
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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