本帖最后由 shane007 于 2023-8-12 12:21 编辑 ! H4 ?; }9 Z, e+ \. I
( k& U& {5 e6 r- k; h! r本游戏使用是高度为8像素的英文字库。6 J3 J1 u/ m3 I" S4 G
`! q+ ~4 a5 U$ V \0 J需要修改的点如下
2 S+ X% b5 I1 s8 ` `3 F: Q7 b y7 E' i《1》将显示函数中按照单字节移动的指针,变成支持双字节。
4 p0 R! B+ ? I: u* e* M《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。4 ?) B* G. q4 `# W+ y
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。& ~% L+ k/ [5 L" l& @' @
! Z1 g& z$ z% ^, D对话显示函数& c d; ^# z1 V' z$ j5 i$ e
此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。 z9 v" r( v5 y0 N) k8 \, A# j9 l
- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {
1 q7 _. A$ |1 e& N Q - static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
- A: q F7 n' u( E/ A! D( b - static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };6 m3 J9 M: U+ O9 Y9 ~; b; s6 ~! e$ i
- const uint8 *str = (const uint8 *)text;7 W f8 I& O* h) A0 |
- uint16 xs = x;
( t6 o6 x+ F1 s" p2 ~ - while (*str && x < SCREEN_W) {+ T+ @; X/ g4 x' F: R
- const uint8 ch = *str++;0 x! I4 Q5 }9 M- u4 r# d9 v& U2 r
- const uint8 *ftch = _font + ch * 8;6 s9 |* m! ^! h8 {3 l6 V
- if (outlined) {3 Q/ X1 R* q" Q a; L
- for (int i = 0; i < 8; ++i) {4 N [+ R/ @! j
- drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);6 N$ L6 w- _8 H
- }
# n+ A0 p6 K l [4 D# g; O8 \ - }! Q4 c' j" r$ \5 S- z
- drawChar(x, y, color, ftch);
/ C4 w( M4 W2 w f6 z: G - x += _charWidth[ch];
# S& q4 \ \+ W4 q2 n, h6 N$ g$ R - }
8 L: w3 g! I0 @# k* `+ \0 D: m6 T - setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);+ j. c2 C. @: O
- }
复制代码 % ]( w0 t- ]* `9 I& j! p% h
4 F z z/ U1 W( c
单字符显示函数) v. d% h, ?4 d, L# D1 Q8 n3 H
- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
1 b1 T/ T" E" }) W9 ` - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;
) f5 E& K# Q# ] - for (int j = 0; j < 8; ++j) {
2 ]+ p2 Q5 Z4 Q0 w; | - uint8 *p = dstBuf;
: H, `! O, n& I - uint8 c = *chr++;# g' ^: f: @7 L6 {5 g
- if (c != 0) {
- I( Z$ R7 k6 r* W2 l' C - for (int i = 0; i < 8; ++i) {
: m/ p7 I3 X z$ P3 U9 X6 O5 T3 ]- |0 x - if (c & 0x80) {& h% t3 _8 i. d5 ]0 }5 |* {+ f. X
- *p = color;
/ ~4 i6 K C; x' r' c/ O - }
0 Z, R# d: d0 ~. n# R: z) ? - ++p;$ r4 Y2 p+ m0 S1 B+ R8 z( I
- c <<= 1;
# J8 F# `$ D( L* N6 \$ [3 _: a - }
, m0 B5 C& u) ^- _1 c6 Y2 M - }
+ B3 F# {' Q8 p, I( W& t - dstBuf += SCREEN_W;
4 q! Z3 X5 H4 l2 x: W - }8 v& W0 J( s8 v. L3 a, K! o& j
- }
复制代码
( Q' _- A. @2 Z! J$ d' ?4 o* F+ c l |) q1 V/ ?
; q* |' q0 o2 p+ `* z" E1 z( r6 N1 }. ]4 T: @7 D% H) S; O. X; U
% k" T, O; n6 i3 m* v* h( d
|