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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。) O; `! W4 v6 }/ s
我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
0 d& |$ Q$ c' x) f经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。1 ]) B* b( O5 Y* O  V& R# L

- m: L& c# [$ \( R) Y/ t( h: i5 K经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。1 [& w) u! f: B) H: q
其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。
: H: E$ X+ R* `' o! ~& W6 ~FONTE3.SPR里边只有放了单字节的英文字符。
* Y8 G% r% @- ], {. r: X# a0 v* X目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,
, E; v+ ]- c4 y; d当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。5 S# o- [6 @6 b( h0 ?" Y
  g. _' [6 l/ V( B+ @
& y% ~. H  N0 k' a
单个字符显示到画面上的代码如下* d' j7 h3 n" @# f
  1. // Display Font: Z! H7 `3 k* v0 V; `
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {- T' d3 _" V+ U- E
  3.         const byte *spriteDataP = spriteData + 3;
    7 ?1 n; i; L( ?8 ^* G
  4.         for (int i = characterIndex; i; --i)7 N; l( u2 L9 m2 p
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;
    & @" Q: q; C- x6 {; D

  6. $ i  n5 p! K, m+ t! U; `
  7.         int spriteWidth = 0;
    + ?3 p, N" g4 f, [7 B6 `, r4 s
  8.         int spriteHeight = 0;
    5 @9 Y. I  E$ X) j! {
  9.         const byte *spriteSizeP = spriteDataP + 4;/ Q# k3 s- ^1 P9 M, r
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    8 z7 Y& a2 ]  n6 D3 n3 ~) G4 Z
  11.         spriteSizeP += 2;( @. W4 _" G* Y) O7 j. S3 G' i1 ?
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);
    : y% R* |# h( c7 l9 t% V: B
  13.         const byte *spritePixelsP = spriteSizeP + 10;) g6 N7 l7 [+ w: S
  14.         byte *destP = surface + xp + _lineNbr2 * yp;" P3 g6 R! n8 Q7 u$ a9 Z# r
  15.         _width = spriteWidth;
    , ]3 `' e6 o: i2 w- g% }+ U

  16. , d3 K- h% i' D1 x+ o! s2 A
  17.         int yCtr;" s5 G3 u2 A' t$ M  _% M+ X
  18.         do {- z- R2 E# z9 J0 z) K
  19.                 yCtr = spriteHeight;
    3 a2 c" L) o2 m
  20.                 byte *destLineP = destP;
    6 A2 h" V  \, H# A/ U
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {
    7 Y: A& b+ q. ]- D, i1 H1 Q
  22.                         byte destByte = *spritePixelsP;
    9 S! J  ?& h8 u: r- @7 h
  23.                         if (*spritePixelsP) {
    6 o- g+ u9 G; [1 }9 }. l$ G
  24.                                 if (destByte == 252). n- n5 g( }! `6 @2 F- |, U
  25.                                         destByte = color;
    0 D% u( }. X* `) ~! J
  26.                                 *destP = destByte;5 _' m7 H; F9 m0 A
  27.                         }" S- C- C# E9 L+ x
  28. 6 i6 J2 |: D1 A! q/ Q- v8 R1 t
  29.                         ++destP;6 Q4 |1 }) L7 W, k( s
  30.                         ++spritePixelsP;4 d) K& w# j3 [. K  a# v/ `
  31.                 }
    # S+ Y4 G; s: z# x9 Q0 p4 @+ w
  32.                 destP = _lineNbr2 + destLineP;
    9 d; x8 r! Y* P  G  b
  33.                 spriteHeight = yCtr - 1;
    8 [) }9 _* }( i6 X/ s* ^
  34.         } while (yCtr != 1);
    : m! Q5 i3 Q/ R0 d. D
  35. }
复制代码

4 D/ |$ b9 i. s% _8 ]$ A# @# y" T/ x' C, G2 {. K
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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