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

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

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

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

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

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

这个游戏的字库文件保存在游戏的SYSTEM目录下。
" O8 s# @/ q. C8 H0 T' K+ s- D/ _我找了共有三个FONTE.SPR,FONTE1.SPR,FONTE3.SPR。
! D, s/ v$ A2 j# Y7 E" E经过改名测试之后,发现游戏真正使用的字库文件只有FONTE3.SPR这一个。% f; b+ L# W# y# l5 j

9 d. K4 X! M. V; C, B& c经过用十六进制编辑器查看,FONTE3.SPR的构造大致为索引数据(每个字符16字节),以及字模数据。
' E( m9 q- l9 i' W其中字模数据为0XFE和0XFC两种。其中,0XFE为阴影像素,0XFC为透明像素。' u5 Q3 A1 H& j3 J
FONTE3.SPR里边只有放了单字节的英文字符。0 ^* O- X( Y( ^- o
目前的思路是这个原本的字库不做任何改动,按照其像素数据格式,我再另外制作一个中文字符的点阵字库,% i+ E" l' w5 `" [
当游戏显示中文字符的时候,在这个中文字库中取出字模放到画面显示即可。
$ E0 c( h3 M* v
/ T$ p% F/ O, `0 f, ]
9 O+ t, g' i% I# O单个字符显示到画面上的代码如下
5 n  v/ R& I% [* }2 e
  1. // Display Font
    , u6 y3 }# ^  B9 m+ b1 w5 j' t
  2. void GraphicsManager::displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int color) {- O5 Z4 j1 {3 {0 d) ~
  3.         const byte *spriteDataP = spriteData + 3;3 w; p* B, y: f# K* G
  4.         for (int i = characterIndex; i; --i)
    + Z. F9 v# l- Q; w( L6 _3 R
  5.                 spriteDataP += READ_LE_UINT32(spriteDataP) + 16;0 y" K+ o1 V  J8 X: y5 V  Z

  6. ' q4 G' e! i0 h3 N: |1 _. d5 G
  7.         int spriteWidth = 0;
    - z& r, c+ _' t/ e
  8.         int spriteHeight = 0;" `; _3 J5 Z; H; k6 N) v( ]
  9.         const byte *spriteSizeP = spriteDataP + 4;
    3 C/ V; V8 ^5 p# h, o3 |
  10.         spriteWidth = READ_LE_INT16(spriteSizeP);
    * B& E5 u& c* u1 i
  11.         spriteSizeP += 2;
    1 n9 R9 ?7 z% D# Y' H1 W% D, g) q. C. h5 C
  12.         spriteHeight = READ_LE_INT16(spriteSizeP);
    ; r  ~# ^4 W! `$ i  w% L0 u
  13.         const byte *spritePixelsP = spriteSizeP + 10;
    & X* Q( X2 a% c7 r6 @% z" c- j4 ]
  14.         byte *destP = surface + xp + _lineNbr2 * yp;
    7 ^5 ~3 W9 M; o% v; s2 N
  15.         _width = spriteWidth;* M1 B, l2 o: [+ T3 {, \3 ~. B. O
  16. ) M8 N3 K9 n3 f% o  u9 X3 d
  17.         int yCtr;! _1 N2 e9 w5 R" t
  18.         do {/ t6 d  r2 ?1 j# `! _0 @: k( Q( J
  19.                 yCtr = spriteHeight;0 ]' c2 X" u' E  x( X
  20.                 byte *destLineP = destP;
    + S$ B, V7 {' u6 h3 m" {. O
  21.                 for (int xCtr = spriteWidth; xCtr; xCtr--) {4 ~( m3 s; o: ^8 D* p
  22.                         byte destByte = *spritePixelsP;
    2 U7 h7 s' o$ I. F) f. R
  23.                         if (*spritePixelsP) {6 a. d2 ?0 H+ B5 Y
  24.                                 if (destByte == 252)
    ! t& ?9 _6 E- g* J- i9 T8 g
  25.                                         destByte = color;4 \. V6 e# D, v, _1 N8 V+ v; N
  26.                                 *destP = destByte;  H+ O, h; i3 e; J5 J1 `
  27.                         }
    % O2 {- y0 t/ |

  28. % }3 j/ V% K1 B" m
  29.                         ++destP;
    " o; p; D7 O4 J7 S* e8 H, W
  30.                         ++spritePixelsP;! w8 Y7 F7 C. h/ ?. z% `+ v! d# C
  31.                 }% w/ g( [9 b0 g4 F" m# s
  32.                 destP = _lineNbr2 + destLineP;: q  y$ J8 o: e/ O
  33.                 spriteHeight = yCtr - 1;- x5 R; R' n  V- g7 b  l
  34.         } while (yCtr != 1);
    * j- c# F4 P' I
  35. }
复制代码

  V7 K3 T" F6 R
/ }1 T# @4 E8 o' j, [* U6 ]  Z
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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