本帖最后由 shane007 于 2023-8-12 12:21 编辑
" z6 o& i% n U+ |* s9 \. _
6 ~8 k/ O$ `! {3 |本游戏使用是高度为8像素的英文字库。
- B' d9 b' [( L5 T. q3 r( s7 ?7 D$ k
" d9 n' ]: F( e需要修改的点如下
6 v5 c" z* d& h! R8 L: j《1》将显示函数中按照单字节移动的指针,变成支持双字节。1 J; R% _* z& K; C
《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。; y6 T) F9 [$ t6 l( Z3 C+ H
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
2 F1 q) ]9 U/ ~' i8 C8 ? F1 z% e; ~: c0 {5 M$ ?5 O
对话显示函数( M4 c% b$ d' j& s9 [
此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。
# e4 G* w* Z* D6 `8 g1 {- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {
2 ]# f8 M0 H4 g: @" o - static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
& s2 y* V, O: ^* r3 C - static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
- S( `" s" `! `1 v) v - const uint8 *str = (const uint8 *)text;
* ^# }. i0 J) U, T3 X( q. D6 s, h7 D X - uint16 xs = x;
5 C$ p' N7 N4 @8 v- D1 V, O7 V - while (*str && x < SCREEN_W) {% ` N6 r/ v5 }0 }" E
- const uint8 ch = *str++;
; ~+ w* V* ^/ |* X0 ? - const uint8 *ftch = _font + ch * 8;3 Y' I2 ^3 a X3 Y; F
- if (outlined) {
5 c0 n `" A4 K- X/ h9 K0 I* e - for (int i = 0; i < 8; ++i) {$ d0 @- d4 L7 x! a" x3 w% U
- drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);+ f: M7 H# ^2 J* j6 f3 Q
- }
$ d. M" f' U0 K& N0 t `7 v8 l5 c5 A - }
6 M) `$ y. s+ @/ s - drawChar(x, y, color, ftch);
) [" D/ |* T7 q3 s6 O% a - x += _charWidth[ch];) u% r$ w' s" s2 X! [
- }
( U/ C$ S& ?3 d7 f% P2 R2 D - setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
0 V% m# z5 c$ Z1 d - }
复制代码 6 J1 x0 k5 ?2 V3 g9 S
& P6 V5 h6 p1 w2 L$ I8 s$ C l单字符显示函数
+ B3 K; q( w. j8 k( Z( I0 y0 |) U- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
8 c3 F2 Z3 T4 ~0 Q - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;
: Y" w/ M( l* {- X7 n! U/ t8 _; q - for (int j = 0; j < 8; ++j) {/ Q! h8 G! z+ g" v2 N
- uint8 *p = dstBuf;' u! q. D i. L; S0 I: d6 {
- uint8 c = *chr++;
! `+ k1 h2 B# ?4 O7 i7 x: }8 O - if (c != 0) {& ]( T% A8 {+ j" B" n$ e; ~$ ^
- for (int i = 0; i < 8; ++i) {7 S. Y; f8 B0 W0 R- x. O
- if (c & 0x80) {# |0 ^$ _" A) c. j& ~: n
- *p = color;) u8 U. H5 L7 r1 }
- }
4 }1 @: h# ~, i; m; o3 { - ++p;$ i: G$ [3 o3 }8 s: t9 \
- c <<= 1;
" J8 u$ T7 ~% O/ G- R" | j - }! F# B4 W1 L) ?0 B- r: R7 C% d
- }# w$ @/ A F) B0 p; @
- dstBuf += SCREEN_W;
+ D: I# X$ n" [ - }
9 R2 L, W& N( E! S - }
复制代码
2 k5 q; w4 U$ I+ x( G& o( L
2 t& n/ a7 s5 W2 t) |& O. x7 F
G' ?( }+ |3 j$ W5 o* P2 L# x* V2 R8 I. a
- A1 s, R& ?. q, E1 B
|