冒险解谜游戏中文网 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
void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {
" D i6 w& ]0 U! \- C
static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
: h/ M- j+ ^" k9 T
static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
) x& _4 x8 m% s: r$ N1 J/ f* Q2 K
const uint8 *str = (const uint8 *)text;
" O( _, T0 N5 P' U3 e8 g
uint16 xs = x;
7 ~ r$ T' J# n6 z/ ]8 ]/ o
while (*str && x < SCREEN_W) {
) n4 e7 ?" D+ F( M
const uint8 ch = *str++;
a& t+ v. S6 n+ [. {( h
const uint8 *ftch = _font + ch * 8;
5 l% u1 n% K( h# B. A3 L5 D: P
if (outlined) {
7 _2 f+ Z+ e8 h1 G
for (int i = 0; i < 8; ++i) {
- ^' ^0 F' ]$ s+ k+ e# o
drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);
, M8 l( f; D6 {6 V9 B9 l
}
+ {5 V8 D% p9 E7 H' M2 c: b8 P0 g
}
! i' H* Q9 o/ M8 v
drawChar(x, y, color, ftch);
2 Q7 S8 g2 w! o% |. U
x += _charWidth[ch];
' k. | u! m2 `' K
}
! M+ c: p2 w; \7 u. Q8 x; x' X
setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
) E3 ^; f) p$ a* W
}
复制代码
) v5 ~0 n, q9 f C+ w
' G% C3 `' S& j5 o
单字符显示函数
* J( W: F8 }3 m2 G9 q1 Y# w
void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
! Z3 K) p( Y1 S& f5 U) j. \, W
uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;
3 R& O3 s4 L7 t" c0 p
for (int j = 0; j < 8; ++j) {
, z z6 k- Z+ h% i3 S; N$ g: T
uint8 *p = dstBuf;
. M/ l- A9 c, t/ d7 z1 E8 \/ y
uint8 c = *chr++;
3 H# w* c/ }8 l( h7 X4 W
if (c != 0) {
. a8 D+ {5 ]* b" B2 ?
for (int i = 0; i < 8; ++i) {
( I& T% Q2 v( H' ?& ~
if (c & 0x80) {
: t+ ^+ C1 z5 v
*p = color;
% E7 o) u5 q. ^3 ~9 d
}
5 _- Z0 O& t1 F5 N7 |
++p;
9 U' l& T8 G9 v/ r, a' ~: K
c <<= 1;
, u2 E6 ~! d' e5 v1 W, |1 t
}
0 u5 W& }2 |. L- J) t7 x
}
% b/ ~3 j. e- ^ p3 n6 X$ n
dstBuf += SCREEN_W;
# ]5 N. b) M" z8 w
}
4 M3 X7 j# s4 p5 ~- }3 Q
}
复制代码
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