本帖最后由 shane007 于 2023-8-12 12:21 编辑
+ J e' a3 X5 s
9 M' Z' B2 S* s1 o8 F本游戏使用是高度为8像素的英文字库。
' ?- ~& }6 ?2 b* Z% S8 `
' O" x& K9 {+ K* [5 `% x4 T0 J, D需要修改的点如下
3 `; t }; U( A* |- s8 C5 R《1》将显示函数中按照单字节移动的指针,变成支持双字节。
* r T' d( ~, l% T$ A( Z" c《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。. i9 S( E- h) w/ W4 x
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
: k' d# d8 Q& q5 [% Y6 b! E( i) T( z6 [) W, l. b0 V
对话显示函数
; M2 }& T3 I1 V: Q此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。5 W% x" r8 S! {
- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {' l9 }. k! y2 ~7 Z0 r
- static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
% A) l' ?7 c% N4 h4 E - static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };3 p0 B. `* a0 t! L
- const uint8 *str = (const uint8 *)text;/ [& ~$ z7 i6 W/ f5 J7 e
- uint16 xs = x;
: c- B1 e3 a6 u! s5 Q) [: z - while (*str && x < SCREEN_W) {
8 p: I' U0 L) l# V/ R4 g% q9 R - const uint8 ch = *str++;
* Q: [ i% A$ H. G2 c$ L - const uint8 *ftch = _font + ch * 8;5 m' m7 x3 _( V. H2 u. e
- if (outlined) {
7 m% F4 n+ k( _3 n - for (int i = 0; i < 8; ++i) {/ v, j; P, d6 P! u5 d: f
- drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);
- E' ~6 x& ^) u; b1 i - }/ A/ f5 K7 z7 n6 f6 ]. y
- }
$ Y4 @% H W' K - drawChar(x, y, color, ftch);
" i. f) M! b. t/ Y! j - x += _charWidth[ch];
3 O5 r# \7 y) [) B - }
P: t) C e1 M: L - setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
1 |! V$ Y* B0 h% _ - }
复制代码
% n* v6 U O- V7 n5 Q$ I3 q4 h8 f
- x! I4 m+ `0 Z9 n" U: o单字符显示函数8 } f% a1 a1 x( u9 y8 ^
- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
# I- I, Q6 p. p% V9 v' Z - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;( V' y D \4 `5 P9 z3 q+ a, p
- for (int j = 0; j < 8; ++j) {6 Q! a$ m. T* n( K4 T; |9 W
- uint8 *p = dstBuf;0 c+ B$ I1 ?& g V6 T. ?
- uint8 c = *chr++;) u. F( h4 Z8 s
- if (c != 0) {2 _3 C# c9 I. ~
- for (int i = 0; i < 8; ++i) {
$ ]/ J6 A, O( _4 }8 H9 ~ - if (c & 0x80) {) B$ I! p0 N' u
- *p = color;) G; k. Z+ s: f1 i) h2 S6 ^: {
- }
/ u) k1 @/ }& j( o - ++p;3 O# y) |' @7 E& W/ D7 b" I
- c <<= 1;, T* L& U' H* g5 \
- }
& l7 N. g: x# y4 N0 S - }
- z3 V8 y8 s4 J4 n G - dstBuf += SCREEN_W;
; V# C: j$ r2 N5 |+ g9 K% A - }8 B5 |8 P L" @9 F9 h3 p! I
- }
复制代码
5 a9 E9 n! p& r% D/ O1 j+ _: P: b" C! D- J8 B$ S$ a0 \4 `
! `& z8 T; N$ F2 |4 d/ }- c
& F4 v% O c2 `4 D$ i# ^" l
9 r, r) Y& e+ ]* r" S5 y% v |