本帖最后由 shane007 于 2023-8-12 12:21 编辑 7 {" i) y6 W- |. d2 z, _
$ l& p. d* o" t& T
本游戏使用是高度为8像素的英文字库。5 T5 O+ }( a1 y; g5 `+ C7 i G2 u
4 G+ c9 v7 w7 ?* A. D
需要修改的点如下" W' z* o2 E% f; z
《1》将显示函数中按照单字节移动的指针,变成支持双字节。
2 z0 B# G+ A& {8 G: E/ h9 C3 \. G" f《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。- f) q3 ]; k h5 S( [
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
( n$ ^! C, D( O+ p7 _
2 B" D' p$ f4 m, D. X% s对话显示函数
4 f1 a, @3 G( t3 n% q' H此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。4 u O1 L. s s# n) M
- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {
( B; |- _ _; Q3 `7 H' J! [. X - static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };0 \9 G* t- [9 C; {% Z; [! N; n2 E3 I
- static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };" O/ W: t% r" l: J; e& I3 T' i
- const uint8 *str = (const uint8 *)text;
& D, }7 j* y% u- c& j/ z3 H, h' b - uint16 xs = x;' q' \% p" H6 W5 v
- while (*str && x < SCREEN_W) {: V/ r$ Z" N2 q
- const uint8 ch = *str++;
. w& @- g( q; e" E% G+ \ - const uint8 *ftch = _font + ch * 8;
5 F; g6 E8 g* r4 U5 _ - if (outlined) {
' |. ^8 ~$ D% j; \5 y5 j* e0 j: r" M! h - for (int i = 0; i < 8; ++i) {8 v ^* Q2 R6 c2 Y% s9 o7 c
- drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);* }4 Z, c4 b% }* {( V) }- L
- }
& @% u( O1 ^! c& D' R/ L6 \+ } - }1 M4 ?0 d) j; C
- drawChar(x, y, color, ftch);! _ |; i X8 T
- x += _charWidth[ch];* y- q* E/ V# p" F L& t
- }
6 |9 b9 E9 N$ ~% F5 ]; I - setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
" w8 ?2 T6 N1 [- z$ s - }
复制代码
( ~" a# q) l* X3 Y
. H9 L( _) N( Z! x0 s单字符显示函数* G$ [7 T; y' O2 }
- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {9 W3 ~- P( d3 {: e8 _
- uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;3 H* |* ^0 c6 Q. ~5 Q
- for (int j = 0; j < 8; ++j) {
9 a8 s; o" p7 A* X9 S# A3 c7 Q - uint8 *p = dstBuf;( W& ~, p- r( {, j
- uint8 c = *chr++;
9 t- n$ i4 _, Q7 A, k - if (c != 0) {* Y: v( e4 k9 B! Y5 y3 t0 X( q
- for (int i = 0; i < 8; ++i) {
" x; ]& v0 U# e+ [ - if (c & 0x80) {2 Z) \% X) F5 b$ r
- *p = color;
& @# s! V b# }9 `3 ~ - }
$ `! i+ v/ A4 r3 Q' |0 l - ++p;; |7 [) C1 B2 f2 c" N- ]9 l
- c <<= 1;
+ L W, W/ h& u9 w4 G$ ] - }
) p2 h' x2 ~4 d1 Q8 o; {; a/ i - }
) Q9 l. Q( U# p4 g$ r _- e9 J. [ - dstBuf += SCREEN_W;
h! }; K5 ], N" x/ `! m& h - }
9 ]2 M- ~7 k; V; E; J0 j - }
复制代码 ; ?4 f1 S" M' m4 R0 f# l6 f( u
8 G! w" F2 b+ `5 M' U6 t! z y/ A2 H; S5 S4 _
3 U/ g$ }. l. C6 f+ ~
j! G; i. F R5 i& A6 M |