冒险解谜游戏中文网 ChinaAVG

标题: 【Scummvm汉化 #2】Flight of the Amazon Queen 亚马逊女王的航班 #1 字库篇 [打印本页]

作者: shane007    时间: 2023-8-12 12:18
标题: 【Scummvm汉化 #2】Flight of the Amazon Queen 亚马逊女王的航班 #1 字库篇
本帖最后由 shane007 于 2023-8-12 12:21 编辑 * P. c) `; f* O3 S

$ e8 ?" y' w! T1 H本游戏使用是高度为8像素的英文字库。
& ~; o. \/ U% w* ^$ m& b0 V5 G, z7 b4 Q6 j. N
需要修改的点如下4 ~; u- F3 b# a. p  g
《1》将显示函数中按照单字节移动的指针,变成支持双字节。' L/ W% Q$ g% c7 s0 o" y; @
《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。: X8 @9 `' n1 e" L; Z
     中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
, a3 y6 n) g5 e; }! }6 q  E$ {' A1 p5 b+ V7 c
对话显示函数
) z! v' [5 Q+ @) A) C- ]7 O此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。1 u5 U+ @; B$ v4 Y; G* e" J
  1. void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {" D  i6 w& ]0 U! \- C
  2.         static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };: h/ M- j+ ^" k9 T
  3.         static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };) x& _4 x8 m% s: r$ N1 J/ f* Q2 K
  4.         const uint8 *str = (const uint8 *)text;" O( _, T0 N5 P' U3 e8 g
  5.         uint16 xs = x;7 ~  r$ T' J# n6 z/ ]8 ]/ o
  6.         while (*str && x < SCREEN_W) {) n4 e7 ?" D+ F( M
  7.                 const uint8 ch = *str++;  a& t+ v. S6 n+ [. {( h
  8.                 const uint8 *ftch = _font + ch * 8;5 l% u1 n% K( h# B. A3 L5 D: P
  9.                 if (outlined) {7 _2 f+ Z+ e8 h1 G
  10.                         for (int i = 0; i < 8; ++i) {
    - ^' ^0 F' ]$ s+ k+ e# o
  11.                                 drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);, M8 l( f; D6 {6 V9 B9 l
  12.                         }+ {5 V8 D% p9 E7 H' M2 c: b8 P0 g
  13.                 }! i' H* Q9 o/ M8 v
  14.                 drawChar(x, y, color, ftch);2 Q7 S8 g2 w! o% |. U
  15.                 x += _charWidth[ch];' k. |  u! m2 `' K
  16.         }
    ! M+ c: p2 w; \7 u. Q8 x; x' X
  17.         setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
    ) E3 ^; f) p$ a* W
  18. }
复制代码

) v5 ~0 n, q9 f  C+ w' G% C3 `' S& j5 o
单字符显示函数* J( W: F8 }3 m2 G9 q1 Y# w
  1. void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
    ! Z3 K) p( Y1 S& f5 U) j. \, W
  2.         uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;
    3 R& O3 s4 L7 t" c0 p
  3.         for (int j = 0; j < 8; ++j) {, z  z6 k- Z+ h% i3 S; N$ g: T
  4.                 uint8 *p = dstBuf;. M/ l- A9 c, t/ d7 z1 E8 \/ y
  5.                 uint8 c = *chr++;
    3 H# w* c/ }8 l( h7 X4 W
  6.                 if (c != 0) {
    . a8 D+ {5 ]* b" B2 ?
  7.                         for (int i = 0; i < 8; ++i) {( I& T% Q2 v( H' ?& ~
  8.                                 if (c & 0x80) {
    : t+ ^+ C1 z5 v
  9.                                         *p = color;% E7 o) u5 q. ^3 ~9 d
  10.                                 }5 _- Z0 O& t1 F5 N7 |
  11.                                 ++p;
    9 U' l& T8 G9 v/ r, a' ~: K
  12.                                 c <<= 1;, u2 E6 ~! d' e5 v1 W, |1 t
  13.                         }
    0 u5 W& }2 |. L- J) t7 x
  14.                 }
    % b/ ~3 j. e- ^  p3 n6 X$ n
  15.                 dstBuf += SCREEN_W;# ]5 N. b) M" z8 w
  16.         }4 M3 X7 j# s4 p5 ~- }3 Q
  17. }
复制代码
2 M( l; w, d& [
' r: ~: Y% w3 k# d1 \

1 q. I+ |1 g: R% j2 q. b- B  E' \

( P  v) \. S6 }8 }% H4 p




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2