本帖最后由 shane007 于 2023-8-12 12:21 编辑 # d3 [, O' R6 X6 C6 W) ]; q Y
* I: i1 p+ e2 X0 _
本游戏使用是高度为8像素的英文字库。# ^1 s4 ]' p% B( Q- E
/ K* F3 ]( Y% G3 p
需要修改的点如下: F# ]+ M' h r- b3 j
《1》将显示函数中按照单字节移动的指针,变成支持双字节。3 s, @ q! ?3 \* j8 d
《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。
- U+ p+ j- T* w7 d& p }3 a 中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。+ C- m. V, k6 x
$ }" A( G" `' p) T& n; \" T/ m对话显示函数' Y- I7 S2 h" n
此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。, I, A$ u" r9 r4 w% ^0 ]
- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) { ?3 r) A5 t9 }
- static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
4 U4 p; j; r. E. K! V- }6 J5 C4 w - static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
6 f2 x/ d+ D1 d2 o9 p; n( N7 A - const uint8 *str = (const uint8 *)text;
7 G5 r1 l- t8 O! S: v# ^. j - uint16 xs = x;4 d0 c0 m3 n* ]# t* e. g
- while (*str && x < SCREEN_W) {) h3 F7 D/ r4 ]" K" G& M# \
- const uint8 ch = *str++;
; V3 ]( |, v* H/ j" y9 ?5 B" E% ]$ m - const uint8 *ftch = _font + ch * 8;; r& [7 B! y* C' ~6 t
- if (outlined) {
; b* y. e5 V" { - for (int i = 0; i < 8; ++i) {% U5 t6 u3 v+ x) L
- drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);
; o( N7 C% T' K- f* S4 b - }$ r( [4 y8 |6 w! c( o/ x
- }
& c. u P* q, M - drawChar(x, y, color, ftch);
2 J& B9 _ j j! P9 R - x += _charWidth[ch];
* `! Q/ r! m8 P7 A - }0 F0 q1 q* ?* r3 n% O9 U2 t6 N5 C
- setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);
m; e% S% X$ U$ c - }
复制代码
; Z; p+ ?. D9 s! [+ \) V5 s% }
D) b$ r9 c( A/ p单字符显示函数
- J0 @% F S# E) U, E6 w3 a% Z. d- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
! @' ~7 O9 L( a3 \5 Z3 \# o - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;7 c4 z, @ z8 X! }7 X" J! Q c7 ?
- for (int j = 0; j < 8; ++j) {
- m* S7 g' ^2 z: Z' f3 a- K - uint8 *p = dstBuf;
* M0 f; |$ R% K - uint8 c = *chr++;: z# F/ e% P$ Y0 g8 b H- y }5 l
- if (c != 0) {1 x3 O3 a( w) H& z/ d9 t
- for (int i = 0; i < 8; ++i) {1 X: X* E+ z5 C# G
- if (c & 0x80) {
% o7 o& @( E: s7 f - *p = color;
! U& Y% ^6 Z; D: a& _ - }. z w, r$ I" @ R0 G8 u6 X9 \
- ++p;( t$ | C. i/ I- b8 q s* v$ u' Y
- c <<= 1;/ l; \/ {4 K1 @" Y; ]/ W
- }0 ^% V M @6 E. ~4 `
- }5 O' w3 W) E% a2 i9 t
- dstBuf += SCREEN_W;
- s; @' f" x1 O - }
# u7 y- C- B! _, K, ]& _2 T- K7 q8 r - }
复制代码 1 c' t4 Q m5 s& U* I: h \
T, l/ g z% M! @
/ h: G. v6 f6 I
6 Z8 d% s5 H& [% d/ ?+ t+ g# Z* |9 m6 t
|