本帖最后由 shane007 于 2023-8-12 12:21 编辑 , f0 z: @% i3 ]
9 s+ Y( `' R! H) i% I
本游戏使用是高度为8像素的英文字库。
6 z) K) } S% u& W' B, m, g8 C' I+ z r
需要修改的点如下
" m# F4 @# U+ @. D3 I& Q, ?《1》将显示函数中按照单字节移动的指针,变成支持双字节。- a; J1 o: \* v# e7 {- U9 Y
《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。
. h& v% x2 i5 Q0 I 中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。, R$ o; G4 k/ K. g# N$ _9 G2 M; m1 [
! b; H1 |# b: W" Y7 X. e5 v j对话显示函数
% h: }3 [, b" p9 V1 z4 S此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。
) C3 g9 p$ V1 L/ @; K- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {( P' C0 o$ f( X5 W/ m
- static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
: ?" }2 m; O9 [# L2 `: j$ o - static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };( D4 O8 y1 U' O2 \( R$ C, b
- const uint8 *str = (const uint8 *)text;- h- F |0 o0 b$ ?. L
- uint16 xs = x;8 [+ }- ~& ]' G% {# \: R% H
- while (*str && x < SCREEN_W) { S$ a" E* a, u x' m: r' S5 R
- const uint8 ch = *str++;. h% g6 `4 h+ c. n1 W
- const uint8 *ftch = _font + ch * 8;: d1 l2 O1 r( T$ `# s; S: A
- if (outlined) {& c: j% ~: z i2 M0 u
- for (int i = 0; i < 8; ++i) {
- {6 u7 ]( Q a7 `, N% Z' E - drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);
( [0 {9 k6 n( r* ?& x4 [% k! n - }$ a/ _; J5 W: Y9 M
- }$ {4 J! b! x# p9 [
- drawChar(x, y, color, ftch);* V) h9 y! q/ L7 Q7 h% G# l. i
- x += _charWidth[ch];" L. z4 e6 f2 Y
- }
4 I$ t. k0 J, r* U; N! I! U - setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);) o/ `: @) ?) B# n" X
- }
复制代码
$ l$ n/ i( _- e* J3 f5 Y% k3 l" k" V& h0 W" q, n
单字符显示函数3 t" q- H, ]; Z% H4 _+ K, Q
- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {% t9 J( k" B b$ J: C
- uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;* Q8 k( Q6 j! R b# r" N& r# `6 {
- for (int j = 0; j < 8; ++j) {
% Q3 T9 X" k' `, } - uint8 *p = dstBuf;
9 C4 ~- \) M8 S6 Y6 X. W. I( X8 ] - uint8 c = *chr++;
1 L$ ]5 M8 {1 W$ K# w6 F" d7 j - if (c != 0) {0 S, L; y. @' J/ m+ K3 s; I6 S
- for (int i = 0; i < 8; ++i) {& B$ T: J: T r0 l; C' L
- if (c & 0x80) {) s5 z: H' N7 v% u9 G2 b5 O: t
- *p = color;! x& U. r( z- I8 [8 o4 z7 C
- }- g9 g1 ~8 j3 ~0 t/ x" g; I7 E
- ++p;
; W, f3 P/ ^6 m; X - c <<= 1;
; I. G& S% Y; ~ - }8 q+ f2 a$ _2 ~5 g/ R% x+ S
- }7 a, W/ h( | S' n2 w, ^
- dstBuf += SCREEN_W;
4 K3 ]- G( z: ~/ x - }: t$ i: n( W7 h0 f9 Q
- }
复制代码
& t" u, s5 R$ g3 I) O, G5 t0 ^4 v! m- S9 D# y
1 L+ \, B* [, p2 t) i1 H
0 S) [% x& H' `- ^& s% x
4 c0 ^, x3 S4 n- @, v |