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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。2 d2 r* i5 {9 ?4 F! D
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
; @! M  ~& l7 V/ Z$ j* i$ p经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。
6 p3 c7 A2 x4 G9 m2 X+ B6 t
; j. p7 f3 |/ e% v6 X经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
; L: K, i9 k/ l# l其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
- g3 F9 R' I0 fFONTE3.SPR里边只有放了单字节的英文字符。
2 a( o  \9 N' f- b1 \8 e2 Q目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,1 A  b* `5 y6 {  Z# s& Z
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
" v8 J, f8 t* P* R0 h7 q1 o( A( i( R7 O# z0 ^; e
3 V" K6 ~5 o0 \; |# Q2 U8 w. [
单个字符显示到画面上的代码如下+ p3 D$ M4 C4 V- v
  1. // Display Font
    * f4 ]6 U. \; V# T: U
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {
    " ~0 s! [: q/ [+ F9 |( W; {9 I
  3.         const byte *spriteDataP = spriteData + 3;7 q; x- f, l# u5 X9 A) V/ O$ X
  4.         for (int i = characterIndex; i; --i)1 s! t1 D4 P3 Q# o8 [2 F& H
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    / R2 @  l% |0 U+ w

  6. ' {  B3 M  |8 W$ n- b+ p) \
  7.         int spriteWidth = 0;: U/ q( G0 G2 h
  8.         int spriteHeight = 0;4 X' m# h* N" E# }% S  P
  9.         const byte *spriteSizeP = spriteDataP + 4;& k, ]# x/ g- M; U
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    9 J& {# G5 b: [2 W) r
  11.         spriteSizeP += 2;. }5 \# d  L7 U1 Q8 T, m7 k% g
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);
    " D0 C  V$ D- ?# R
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    $ ^7 ], w: F$ G( a6 w
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    + ^1 M: S8 L$ P
  15.         _width = spriteWidth;
    ) i3 P$ p: a7 ?
  16. 3 x$ |0 z/ D* K
  17.         int yCtr;( a( ^: B% T" C2 [) g0 j
  18.         do {
    ( P( \. U$ I; V
  19.                 yCtr = spriteHeight;/ b& {* J" y1 B- [9 J% w  {
  20.                 byte *destLineP = destP;
    ! G# D, {5 Y5 R# ?7 l7 R7 h
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    , M) j9 Y: M5 N% u/ I' Z
  22.                         byte destByte = *spritePixelsP;
    ( F. n8 W/ T2 ^  y( R4 c8 N
  23.                         if (*spritePixelsP) {& a1 ]$ P  F7 u4 P! e1 ~: N; j
  24.                                 if (destByte == 252)+ J) z# Y; C3 V- t, P+ d
  25.                                         destByte = color;
    6 E& \& N* }9 b
  26.                                 *destP = destByte;
    ; |4 s4 ]1 l0 j5 ?$ F9 {4 d+ J
  27.                         }+ |5 X2 l; k+ i6 s9 t8 |

  28. 6 u; r5 D7 ^! k/ h  U  i
  29.                         ++destP;) }( v7 \% z$ g* Z( ~( o9 q+ _  v
  30.                         ++spritePixelsP;. H, }$ g0 L/ T( a" j0 d; h
  31.                 }6 S. S0 l4 s/ ^/ e; }2 P6 V
  32.                 destP = _lineNbr2 + destLineP;
    ( s4 P+ T  z% T9 ?+ |
  33.                 spriteHeight = yCtr - 1;+ w! t# k. c1 ]  p4 R7 o) [/ S- S( s
  34.         } while (yCtr != 1);
    ( g* b& s' s! |7 a8 t6 [  T  v
  35. }
复制代码

+ A8 a2 m1 @$ f0 }" I
1 j+ _& q. ~& W" W; 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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