本帖最后由 shane007 于 2023-8-12 12:21 编辑
9 |- W+ K6 L6 p# h3 v& G. F w
# Q' L* C% U; [" ]本游戏使用是高度为8像素的英文字库。
& f/ ?% O, Q; u
: J& q1 K" E% i6 j f需要修改的点如下
6 d& t0 ]7 R9 B- c《1》将显示函数中按照单字节移动的指针,变成支持双字节。/ `. t6 `& a7 ~5 V5 ~9 ~
《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。
9 @; q5 [, b( L, Q 中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。) w- j. J, P d9 A0 Z5 d
! \5 M" R3 q' ] w对话显示函数
% u( s( K8 @7 M2 F( n此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。
+ D" r" t! W1 w" T9 O8 {9 W. T( s$ Q- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {. R0 \+ G0 g$ J( x7 d5 B# H# `7 r
- static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
' }1 z; U5 [, O# [ - static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
4 K$ j; f- n& {# J4 P - const uint8 *str = (const uint8 *)text;- T$ w# k$ Y3 l0 C- g$ @' O I6 k
- uint16 xs = x;
0 P8 w& O0 \* n4 Q - while (*str && x < SCREEN_W) {
, a3 L6 ^. ^/ c( }; ] o( Z0 ` - const uint8 ch = *str++;1 P0 T/ p4 h0 V
- const uint8 *ftch = _font + ch * 8;
' v- o' {- A: y5 I& M - if (outlined) {& N) R; ~6 z2 z/ p! P
- for (int i = 0; i < 8; ++i) {
8 o2 Z$ @+ \" N- N. o - drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);- H" g3 D2 q- E; v% W
- }
) G, n" f, B0 g2 b - }0 V* o1 }! l: v6 o; t. t' `
- drawChar(x, y, color, ftch);3 S# \, t' o& n+ T, g7 S! a
- x += _charWidth[ch];
; ]/ n _) s0 }6 h) t - }& ^. A$ B9 J* v6 e8 T- f& ~* ^! y) |
- setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
" x8 ^2 W4 y& _ - }
复制代码 3 O& O9 A: Y$ c
* x2 q: x. ?) j( R0 \! i m
单字符显示函数
: }2 U& N8 \. Q5 e- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
0 h, G+ G. z% a) v6 Q - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;: e6 n. i) k& D$ R
- for (int j = 0; j < 8; ++j) {- S1 i! D. m$ U" y/ [# @9 u
- uint8 *p = dstBuf;
' t \: L- Q' A& q6 ?0 T - uint8 c = *chr++;
1 }9 i) P, X2 i+ C' `0 m - if (c != 0) {4 u% V- j3 i/ t+ m
- for (int i = 0; i < 8; ++i) {
, e! c) @4 K+ I- {( R2 e- V - if (c & 0x80) {
" a- a0 D3 [" P# u3 U/ s4 t - *p = color;, A& k: L' A8 f0 @: x
- }
% ~/ z6 `+ V0 H5 S! p0 M5 l2 d - ++p;
: B; `; E1 Q/ z1 {1 W - c <<= 1;
" m1 E! K( o& m - }
/ N1 F7 c- S0 `) a8 o! l6 [# r L - }
. _5 y# K6 l J3 I/ R1 S7 l' y - dstBuf += SCREEN_W;
7 q7 f# U- f8 ]/ z2 p - }
! k9 A7 e& {* I% ^6 I' D - }
复制代码 N! s+ l& ]/ N" i
# ~. q6 |$ } ]* H1 W" ?
+ _; U% E6 V5 O
) \! e0 ]3 j- B" w5 C! G" b7 g8 J' P2 [" p3 s. X( Q
|