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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。
6 }6 o) C8 d* R9 O: t) ^我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
& h, x; X' V$ ], v4 B7 x6 F经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
" D( J) P- ], L9 J) b: G. O. P, ^7 t! }
经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。, d2 E+ L3 L/ v% ^- p: [% n0 X1 ]
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
4 w& J$ }. ?4 Z. N) CFONTE3.SPR里边只有放了单字节的英文字符。% F7 H* R- |. ~' F4 L' c7 h% o8 Q
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
" `" D4 O" G; ]当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
  C2 U, n0 ^3 M
" j1 d) c; u# _' w- z) N8 C8 a  L0 F8 F- x  n# Q$ p
单个字符显示到画面上的代码如下
( W4 e& `6 Y! Q9 O
  1. // Display Font
    . s3 p3 ~/ q9 t3 J7 v, k
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    1 A+ |% E( G, [' {  h3 J
  3.         const byte *spriteDataP = spriteData + 3;
    # K9 p" `9 |& X% Q. V! w
  4.         for (int i = characterIndex; i; --i)
    $ W6 B2 G  `7 O! Y. ?( Y
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    3 ]3 p+ `7 o# D# L1 q

  6. 9 e/ X# N+ [3 S7 E
  7.         int spriteWidth = 0;, ?, u# h4 N5 W& t- m7 B
  8.         int spriteHeight = 0;+ z, D' p" g* }8 [. {" {9 m7 _
  9.         const byte *spriteSizeP = spriteDataP + 4;
    % k5 ]: ^: r$ a/ q% H/ I! T3 m3 G
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    1 }; B; g/ T4 @/ ^& Q
  11.         spriteSizeP += 2;
    : |" L1 N8 a" K( B1 f! e" J
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);
    3 a. g3 L* W1 s: {$ L$ X
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    6 V) |+ X9 e  j; B8 N. x1 L5 t
  14.         byte *destP = surface + xp + _lineNbr2 * yp;, }! g9 V- `0 t4 g! T: w; R& j
  15.         _width = spriteWidth;
    - Q# O6 _- i6 [/ r3 u7 M  r
  16. # @0 S( k( _. p: a5 L1 B
  17.         int yCtr;/ o$ Y( l: |4 d) _8 x
  18.         do {1 s/ J+ n( N8 k
  19.                 yCtr = spriteHeight;+ X8 n* R( O2 I" ~* c+ X
  20.                 byte *destLineP = destP;
    * h* y- }4 I8 [1 ?* H/ Q$ f4 `
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    ( m* D. R6 j1 u+ @. c
  22.                         byte destByte = *spritePixelsP;
    % c" w+ v. S+ t7 Q1 s
  23.                         if (*spritePixelsP) {
    ! z' C6 X: Y% H1 H
  24.                                 if (destByte == 252)/ N3 F/ c# M( q% k. j, L
  25.                                         destByte = color;: I; R( ]% a* ^: k+ `) S7 I
  26.                                 *destP = destByte;3 M2 U5 e6 |/ |; N# w+ d' i0 R7 a
  27.                         }
    5 i# N" E$ M. w) F, |; S, m; k9 m
  28. , r# X! F9 ~& m7 V7 F: `: l- m
  29.                         ++destP;. y' ?0 ]5 W8 \. O* V6 q
  30.                         ++spritePixelsP;
    ; W6 d- d, @, A
  31.                 }
    6 h0 K) X) F8 K7 R( @
  32.                 destP = _lineNbr2 + destLineP;
    5 I; Y9 x/ ]2 w$ j
  33.                 spriteHeight = yCtr - 1;% O4 |! L* e/ O, R5 T: ?+ t
  34.         } while (yCtr != 1);3 L4 R, d( [6 T3 d0 S
  35. }
复制代码

3 F2 T; f/ z6 U- y8 X9 {! r3 K' ]4 L5 }* a7 ]9 {$ }& R7 }1 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好1 很差劲很差劲
回复

使用道具 举报

沙发
发表于 2025-4-13 09:58 | 只看该作者
学习学习一下
回复 支持 反对

使用道具 举报

高级模式
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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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