本帖最后由 shane007 于 2023-8-12 12:21 编辑 9 ^& Z$ [( g5 _5 t& Q; [
! D L$ K/ [& N7 V% G/ A
本游戏使用是高度为8像素的英文字库。5 a( a( q' e2 x9 k- v) s) W
: q' P7 @, b; I# V- J
需要修改的点如下2 H9 j; S! |5 a4 h7 O$ j8 _4 _9 x* `
《1》将显示函数中按照单字节移动的指针,变成支持双字节。3 M% W0 p5 F4 @/ s7 h. r9 f
《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。3 Z, H1 a$ k$ S
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
6 c4 h; M2 G) e- Y( Z9 K+ [* r( f1 n ?4 m
对话显示函数
# M2 _) o1 g9 t% t此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。
% D `, i4 t3 k+ _: @$ H" H- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {
6 W+ \+ P% j+ @ - static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };2 |( i d4 c/ }4 p6 S
- static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };7 Y, y" [- `; L" X. i' o
- const uint8 *str = (const uint8 *)text;) m3 `8 T& j% X' r' C
- uint16 xs = x;
! R& }- z, A' B - while (*str && x < SCREEN_W) {
( Y- T1 A0 s6 R4 ? - const uint8 ch = *str++;, t* W4 g3 E0 r6 B% ?+ o2 X
- const uint8 *ftch = _font + ch * 8;
9 Z9 Y6 M) a% \3 ~6 U5 e - if (outlined) {, ]" M; b- L& G, y& C
- for (int i = 0; i < 8; ++i) {
$ h5 a2 ^9 t0 R/ }3 E! F) C8 c - drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);- `* X+ G! k- N1 L3 ^" f
- }
; H4 Q& W4 M* M) q- p( J - } v' C# b% V2 k! M
- drawChar(x, y, color, ftch);
' @; k3 i. S9 z3 n& I' { - x += _charWidth[ch];
% B; V. U/ C% I. D0 H! q$ E - }( B, U" V/ p+ P Y6 ~' a. d; Y
- setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
, A$ d T' J( K$ F( j( q3 o - }
复制代码
/ A$ o. r5 K# G8 J* c U) n0 f, @1 a& t# I& \9 O: u
单字符显示函数
9 w( ?, |+ {+ P9 c" F1 s- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
B! D* R2 K g1 d( {7 l% A$ B - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;4 {# L, \) H i) W
- for (int j = 0; j < 8; ++j) {
: R$ ?- {; k6 q) t) m - uint8 *p = dstBuf;
! i6 g7 Q7 |8 m - uint8 c = *chr++;. f% \, Y i& X
- if (c != 0) {0 v, Z5 Y* |5 E$ j
- for (int i = 0; i < 8; ++i) {) [7 p% w- A, @) l+ [
- if (c & 0x80) {" x; y c6 T0 H6 H6 J- B M6 w- Q
- *p = color;0 w8 [$ w9 t+ m5 a& o7 k
- }
5 i* n* W B% N: y: W. Z - ++p;
% J A7 A6 I' C3 f" ~ - c <<= 1;
9 V' r! \2 J6 p4 x( n1 ]) K - }, p+ o9 Z3 r9 B& T* S+ H& @ @
- }
% `/ u A- Z8 ?$ P1 P: \ - dstBuf += SCREEN_W; g/ r& z8 k! k" g) H+ R
- }
8 p4 l/ f. j/ L2 s( g. V' G - }
复制代码 ' |0 x* V" _' M0 }) u" e
$ ~: U. E+ q# A+ A
$ s" M) } T& x2 f0 E
) y+ T; _) B( d: H- J5 R: w; X r$ z
. ?; H" c% x0 h5 B0 [. e: K |