本帖最后由 shane007 于 2023-8-12 12:21 编辑
& r# p j4 M" Y' u G+ z$ n. t V) M" t3 X+ q" p
本游戏使用是高度为8像素的英文字库。% y! e0 f) ?0 K5 ?- @0 R
" h/ L. s$ ] y8 q! Y1 V) s8 ] i需要修改的点如下
( c/ \9 H5 f" C1 y) E( V& ?《1》将显示函数中按照单字节移动的指针,变成支持双字节。
9 o$ ~6 i# D7 H《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。 h; h8 B, g$ ?1 q. N% z# { U
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
% s8 a8 N2 i$ ?; I/ ]# @% }" ]3 b& m" m# e
对话显示函数
5 G0 x0 `; }- O, F# F. a此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。
6 ^2 F V- I/ ~8 W4 e- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {
* I8 q, ]2 Q0 Q+ E) U R& m - static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
" H& l$ t, \) w1 |9 x9 L - static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
/ b1 ^" q+ I( s3 r- m" j8 V/ F - const uint8 *str = (const uint8 *)text;
% l! a$ U: r* f - uint16 xs = x;6 j& `) P7 n6 u% N, {% s
- while (*str && x < SCREEN_W) {7 j4 s& f4 U" D5 C; j+ H' A: M' _
- const uint8 ch = *str++;" v+ _$ G9 t: _" ~% ?
- const uint8 *ftch = _font + ch * 8;
- m9 m" A% Q2 }8 R - if (outlined) {
/ w- a( {0 ?- a& S - for (int i = 0; i < 8; ++i) {
! f9 \) k" x( T# t# G( d- `# \+ S - drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);- J7 b6 X& Y4 V: G
- }
% u. J+ H: M9 I - }
- A6 P3 b- H' d3 @: r0 ]5 q$ l0 E - drawChar(x, y, color, ftch);
+ @$ i, E* J7 m, K& h" a - x += _charWidth[ch];
2 U/ F! }# F& M5 P; l/ u* F! e) I: ^ - }) v: g( ^& v8 R5 a$ a" V
- setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
& P/ }$ ^- a& m - }
复制代码 & u5 }, b% }9 F9 f2 p
4 b- ~0 n/ K2 O7 B( g
单字符显示函数
" S: U) T/ P8 j. b: {4 u) q- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
' @. `5 d% R9 f - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;
# U( S( s# d2 Y# d/ R1 B - for (int j = 0; j < 8; ++j) {
& W- r" z' {' W$ F, O - uint8 *p = dstBuf;6 l* E2 T/ X1 t6 }/ i
- uint8 c = *chr++;8 T0 ?$ i% N! z: c
- if (c != 0) {
: y$ J, X4 e2 H - for (int i = 0; i < 8; ++i) {
# T) _+ k$ ], z i - if (c & 0x80) {( X5 g, y5 M4 o' M: |
- *p = color;
7 G/ x4 M; |5 v" p* p - }
2 N/ h" H* `; X) ~ - ++p;: G2 g/ b K6 ]& h. d- W# S
- c <<= 1;
7 p) o" h3 |8 N# }1 ] - }2 |/ S7 X5 |$ p
- }
, |! o; M7 d+ w) `2 H - dstBuf += SCREEN_W;( `% _- b' v! W( i
- }- `+ |$ X6 s9 k: x" g
- }
复制代码 4 [1 [, i e- R- e
4 n% W3 [. ?# K' i$ s3 k5 P) E. i7 |) b
& ]) v+ B9 _6 T6 p3 w" C% f- O
' b: Q' ~& }) v, K
|