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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。4 D9 `' U! h$ m- O  f9 b4 E4 r
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。# S/ S" p4 w, b) R
经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。: u/ Y$ `4 [) C# D
4 x; C& m3 \- }7 f) r" e  Y
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
/ e# J" t1 u' a7 b/ ^其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
  S" [; O3 S- L9 X9 S; |7 zFONTE3.SPR里边只有放了单字节的英文字符。
0 ?: p7 Q+ S) _3 f$ Z目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,* ~! Q$ A, A6 s( |
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。4 `- z0 M' I* U' R
3 t3 @3 T/ F* z9 M

. y# r8 ]# I0 x+ G: ]; K0 x单个字符显示到画面上的代码如下
+ }' ~9 e+ Z" p4 s3 V; K% [5 d
  1. // Display Font+ D# p& Y- _  v) d; K
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    / H% T* ^" c* f( L4 t  n
  3.         const byte *spriteDataP = spriteData + 3;
    4 k' j- k/ G, |* V+ q+ Q
  4.         for (int i = characterIndex; i; --i)6 B  W2 k: [5 `* P9 Z! L& N" c6 A
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;0 A1 D9 Z3 z+ F9 j5 G& B
  6. % F* O1 M$ n. T/ |1 ]
  7.         int spriteWidth = 0;
    / m: |: G1 v) U4 J. n  ]$ f0 A
  8.         int spriteHeight = 0;* [, G. g# U2 U5 E- e" j( l/ T
  9.         const byte *spriteSizeP = spriteDataP + 4;, A) O- c8 P- X3 }+ f$ m- P6 p
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    ) |% [* q8 ^6 B) Q; U
  11.         spriteSizeP += 2;- f1 D! e* d! f; y
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);- z& F* q; m+ z: L
  13.         const byte *spritePixelsP = spriteSizeP + 10;( j1 s4 L; c4 [2 t0 m. P5 n
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    3 _& ~8 t) G( c0 j
  15.         _width = spriteWidth;
    ; ]! D; J% A" r" L3 Z
  16. 7 L4 E( h2 _: n& L
  17.         int yCtr;
    ; @6 F( Z6 M5 ]7 E
  18.         do {
    8 C  M% \1 p% ~
  19.                 yCtr = spriteHeight;
    + O9 T2 ]" H5 N  P, g, o
  20.                 byte *destLineP = destP;- b) e, k6 Z- N5 u; w
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    - l& C: [3 D" s& }4 j
  22.                         byte destByte = *spritePixelsP;
    0 N! O" s+ o7 m; H" G' z. `
  23.                         if (*spritePixelsP) {5 F9 C5 L3 ~: h% w' |
  24.                                 if (destByte == 252). Y& k- a: D$ v9 s+ F: ?8 k+ x4 {3 U
  25.                                         destByte = color;
    ! D! L! t/ F, u8 ?- a1 y
  26.                                 *destP = destByte;
    " ]5 Z, \. H8 C/ R) m0 B( d
  27.                         }) M2 v( j# N3 G5 M3 o1 h: v

  28. 5 x$ Z0 h) o4 n- |/ C
  29.                         ++destP;
    6 q. A8 P$ z# g7 @5 q- j5 m
  30.                         ++spritePixelsP;
    0 `: n( X! P6 _+ s- w
  31.                 }
    7 t; m+ o# b# {, W
  32.                 destP = _lineNbr2 + destLineP;$ |; O4 Y" a/ b- t( b% r, c
  33.                 spriteHeight = yCtr - 1;
    ' y" c8 ^. P% a7 Y  O
  34.         } while (yCtr != 1);
    3 n- t, n$ F* V" e! t% i8 @1 `
  35. }
复制代码

0 E4 w+ }* @3 H% ^, \7 }
+ y+ M4 c( o  g8 w# ^2 E
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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