本帖最后由 shane007 于 2023-8-12 12:21 编辑 : @7 U9 p* M4 I% {+ Z) P
! z# J& s. U' {" R3 k# u7 a6 A本游戏使用是高度为8像素的英文字库。
4 p) S8 i3 }3 t1 K/ y. O1 ~5 b" N4 j9 }7 W3 v
需要修改的点如下9 H/ ]* a% Y) ~- B; z" u, T' `
《1》将显示函数中按照单字节移动的指针,变成支持双字节。
- K" [; c* }0 Y- s& F% L1 X《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。' G: b1 |) J/ Z/ d( o
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
+ A& b! F3 ^( m. o9 m' m4 F$ B9 F% c0 o9 N
对话显示函数
) a6 m! j8 Y0 ^% r( e0 s. e+ A: h此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。
6 n3 j$ }/ G# e& T! R- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {! K, J+ q1 t/ e1 q2 q4 G9 j! ^0 b
- static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };1 z. E1 t" W0 S6 V
- static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
. z0 a C L) |# y - const uint8 *str = (const uint8 *)text;5 e, ]* Z. Y3 h5 g
- uint16 xs = x; _ S. l* X/ y
- while (*str && x < SCREEN_W) {" S" ?+ k: p2 r4 [/ b) u
- const uint8 ch = *str++;: m; p [( N1 G J0 K6 d$ H
- const uint8 *ftch = _font + ch * 8;$ b0 E+ G! P" P* s' s5 t }
- if (outlined) {
# O; k& J% z' U( d3 B% x/ t - for (int i = 0; i < 8; ++i) {6 x" ?2 t4 U8 W5 M' e% Q
- drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);- b0 Y9 X4 T: @/ A
- }
! z n" d* X4 F) w8 N: n9 l/ {( v - }6 L$ `4 M8 N! d: c- S- h
- drawChar(x, y, color, ftch);
9 m! e+ N* J4 j: }7 h( v0 T; K - x += _charWidth[ch];
' l# z% w. V" ?7 a2 H6 w2 {% e2 } - }
. t9 Z5 @: D$ x2 w/ C1 | - setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);* p- z5 V5 W: U) P$ }6 ` w
- }
复制代码 0 k$ S5 L6 U) ^& |0 N8 v
% S$ X- I& Z V9 n$ B4 ~* p J+ K+ y
单字符显示函数
$ \, A2 v2 m) r8 |6 }$ Q& Z- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {* T7 J! c/ d7 T& J
- uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;$ Y, l* Y2 R q+ o% h: r; K! Z
- for (int j = 0; j < 8; ++j) {7 X3 H7 a. ]& P. v' u
- uint8 *p = dstBuf;- u, x6 f7 X6 V, f. R
- uint8 c = *chr++;- @% G" j3 f2 \- q5 }
- if (c != 0) {8 @9 J8 E5 L+ E% E( u7 e
- for (int i = 0; i < 8; ++i) {
8 g) j1 S! q1 m: ?" | - if (c & 0x80) {) H' O( V' L! x8 T3 o2 N
- *p = color;' h7 b" N$ r. @+ F6 ? n
- }
: s# v5 l5 y$ C6 T5 Q - ++p;
/ _ ~7 |; w: M2 s - c <<= 1;
$ T0 G7 D$ f: L( ^* j - }
" p" Y% j5 V6 N( a! L - }
& {/ G8 g! X$ L. l. } - dstBuf += SCREEN_W;/ C9 }. U6 o( P( Z
- }
1 f0 M3 l, h6 Y - }
复制代码
/ S; _" }2 w" E, V! B
; G8 h5 ]- L* g3 u, S6 c5 U# D/ t. g5 b! {$ j
1 r% l! V' r4 l
* M$ C4 |% L: n
|