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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。$ f+ }  z/ T# Y( d. S1 o% |
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
0 ]& p$ Y) D" w8 L1 F; [) B4 J经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。, O0 r' X% V# X2 ]1 s- Y7 t
; M2 Y1 D. @+ _' T& k
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。, s* G2 L0 U' L
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。- j2 P5 `* x' f/ S$ d
FONTE3.SPR里边只有放了单字节的英文字符。
" W9 H0 W* A- J, @! z$ x目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,( }  s3 ?$ v5 a+ }1 P% H0 [
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
8 h: W6 ^4 B% R* v
% z; a5 K2 c, S# d: F5 O* n. P* z1 }! I$ v) H, o. F# ?3 v
单个字符显示到画面上的代码如下1 N( P) I- q/ h' Q+ M6 N
  1. // Display Font& ~$ z) ~) _" K7 M
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {9 w( r, [+ d: V& a- i
  3.         const byte *spriteDataP = spriteData + 3;$ |# E; r$ M- ?; m
  4.         for (int i = characterIndex; i; --i)
    1 D6 u1 G6 V# j
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;8 M1 A: n" D1 j- r

  6. 8 [& {6 j* ?% ^1 F9 _
  7.         int spriteWidth = 0;7 M3 U3 A2 ]" D
  8.         int spriteHeight = 0;" U# U/ z# A2 j$ G
  9.         const byte *spriteSizeP = spriteDataP + 4;# ~- q# j- K, X1 Y8 U
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);- G0 W# l+ a" A2 `( \
  11.         spriteSizeP += 2;
    7 ^$ B# w4 D' Z0 @
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);. K' v! z8 V0 ?1 C, E' u! e: \
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    / R1 F. n% Q1 b8 v
  14.         byte *destP = surface + xp + _lineNbr2 * yp;9 {" O- O% J- g+ u
  15.         _width = spriteWidth;/ V, m: Q/ A% y3 h

  16. 1 p, b! t* \( K$ f, ?5 U- }; A; L- H
  17.         int yCtr;
    " v8 ?2 D( `9 I. y; ^+ a
  18.         do {& X! D+ q0 ]3 h
  19.                 yCtr = spriteHeight;
    , w8 W; j0 w) \3 N! e  |1 l
  20.                 byte *destLineP = destP;
    & W. |" Q0 r$ q! w1 Z5 h. M  T
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    ! @4 L( x& A% q& `
  22.                         byte destByte = *spritePixelsP;) ]/ M# g" g- i
  23.                         if (*spritePixelsP) {
      {! v+ n! J$ N5 `1 I( s9 H8 _
  24.                                 if (destByte == 252)! G' j7 o2 j  q8 d- }& z
  25.                                         destByte = color;# L0 v! z7 k# l6 p
  26.                                 *destP = destByte;
    # F7 X) K0 @. c3 o8 Q9 S
  27.                         }% U  u* g8 v( S3 r  ~7 y& k2 u, r
  28. 0 M# e, f, F1 B8 {; R
  29.                         ++destP;
    . E) n% B/ `0 ?: z  z. P. g' z
  30.                         ++spritePixelsP;1 E3 i5 w  t' l# H3 l2 Q
  31.                 }' d3 G+ \! ^. }! U% h/ H
  32.                 destP = _lineNbr2 + destLineP;
    6 N1 d8 u8 x4 ]4 ^& O/ j& _0 \" d$ N
  33.                 spriteHeight = yCtr - 1;- K$ J/ `) i, q! T' ~3 `
  34.         } while (yCtr != 1);
    " W+ Q, M$ h4 A9 _& q" J4 ]
  35. }
复制代码

8 K9 ]7 |4 U2 L1 J; b; ?2 C& s% }, f: A  y
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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