本帖最后由 shane007 于 2023-8-12 12:21 编辑
) a u1 m: E& i$ p( F
- C( j- Y$ p: P( W* r! s, q/ R7 m本游戏使用是高度为8像素的英文字库。
- x$ L" J( k, s3 O
! L( ~$ N z: L' `5 T" i需要修改的点如下4 {; {' f6 K; q5 t4 W0 [# X5 @
《1》将显示函数中按照单字节移动的指针,变成支持双字节。 w5 P& f% j u& d6 J
《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。9 ]4 R/ p2 h% W: b: {
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
" p) |9 W: L4 [) G2 a
2 b( _6 U7 C' t- J1 i8 Z" w对话显示函数
7 i5 D9 ~! x7 d5 \; ]此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。
4 ^4 Y" {4 u0 \! Y, c, Z! M- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {5 d0 H: D: I' L) C
- static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };2 g" E1 M t& Q7 t: E1 D" A* m/ i
- static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
i4 o: w, d; F' B - const uint8 *str = (const uint8 *)text;! F5 D. ^0 M$ i' z; v0 j
- uint16 xs = x;+ f9 Y' H0 [2 S% F' @9 U
- while (*str && x < SCREEN_W) {: m7 K# y2 n5 `+ Q: T5 Q+ m6 `
- const uint8 ch = *str++;- T$ M* j" S. M5 n
- const uint8 *ftch = _font + ch * 8;
. o+ j3 Q% P3 i+ h - if (outlined) {. u% S* M; X' c, T9 K! T' T* p+ M- K
- for (int i = 0; i < 8; ++i) {
! c' y# |0 s; K% ?* b - drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);
) X* h. n/ v6 k9 _ - }
- y0 i# P& W* ~( d - }
6 ]1 P$ U# X" `# d - drawChar(x, y, color, ftch);: \& U7 t/ v( n, T( B4 i
- x += _charWidth[ch];( M# x6 ?5 ~9 m
- }
; E$ Z% g2 P, T- z5 Y2 l - setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
0 [1 Y6 k& m. K4 Q - }
复制代码
9 |& b' r/ Z& K t6 y7 A- L" h% G& u) N) c; e# T
单字符显示函数. r7 W4 F U; w: }% B
- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
3 Z, F. A! n" T2 J% m/ g - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;" b9 P. }0 w9 v: _
- for (int j = 0; j < 8; ++j) {7 u& k" l. |% {5 Y) G( V" z
- uint8 *p = dstBuf;* p6 Q2 F) o* l2 F$ w
- uint8 c = *chr++;
s3 _+ u1 o0 f) _- x( O - if (c != 0) {
4 {: i' E( P' L7 n* u# G0 h$ m9 p - for (int i = 0; i < 8; ++i) {
# m9 Y% n7 L& r5 z& T - if (c & 0x80) {0 q& g3 u- P5 n/ L6 o
- *p = color;
' [7 N4 @! K$ J0 m - }
7 U8 S& H. `; e: i, T2 X - ++p;8 R! _' E! C: K5 m' E+ \+ U
- c <<= 1;
1 u* k5 H# f P+ K5 x1 \) D. Z% s - }
; C9 ~9 R! D( D4 ~# ^ - }
% H3 s' ?- m! P0 {. w* q - dstBuf += SCREEN_W;
* c! k0 U8 N/ h1 B8 b - }
; B: @0 X. N! ]" I - }
复制代码
" S0 L' ?- i4 n: B F
n8 Z' B; L/ n6 w; ~6 z% R" c* @& u N5 K
, U" n$ c/ r' ?& }! W8 Y7 f0 t* U
3 ?5 n% K) _" \+ M) g6 G |