本帖最后由 shane007 于 2023-8-12 12:21 编辑
. V3 F/ Z, a( a, w" y2 U4 M3 E! r* `. W' D' a! D/ M5 A
本游戏使用是高度为8像素的英文字库。' Y" \' D5 a' C d8 ~8 E
5 o0 |- t6 s, @# [: y/ ]需要修改的点如下) p1 {/ M6 b' _8 c& |6 }: A
《1》将显示函数中按照单字节移动的指针,变成支持双字节。5 \+ y9 S& B. {3 b
《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。
* p' c2 b3 J/ b8 v, p D* v 中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
! @5 ]0 V& ~4 ?0 A; h% J/ m! `, e0 L( y( r' E5 F H
对话显示函数
, \, y. F9 Y( T+ u5 h此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。% p, P5 j! G0 h! |$ B* f
- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {0 d( r% }1 |1 |
- static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
$ ~- F5 O4 y4 ~+ N2 }# w* j* K- a - static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
- Q' S+ [0 G: m: Q) _) w1 n# l - const uint8 *str = (const uint8 *)text;8 X2 |1 `) o/ M: x2 `
- uint16 xs = x;
+ x! p4 m/ `- \ - while (*str && x < SCREEN_W) {
' o( e) F9 `, M" m! H8 v2 ` - const uint8 ch = *str++;
+ J8 R! E; f+ z. e t& ^3 A2 F - const uint8 *ftch = _font + ch * 8;7 ~; b0 T" ^$ s, n# N* p
- if (outlined) {* X1 \) U' `6 h* F7 ?+ p
- for (int i = 0; i < 8; ++i) {0 ?) o4 d6 O) M" [" n
- drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);
+ i! b" [ ~) p9 B" M+ t - }
7 P* Q# f* N2 P0 ~" s - }
* m1 B! M/ r2 ^' e. h+ i - drawChar(x, y, color, ftch);4 u' k% N* [3 y
- x += _charWidth[ch];+ m W' w6 F# ]8 y$ C7 ~" N( y
- }" N, Q: B/ }5 ], P# ~
- setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);' [. a. a S0 z* \3 \
- }
复制代码 ) ~7 j+ U- U1 T# o) L
' e8 Z# L) d! Z& x6 ?
单字符显示函数
% Q, R1 N. P' {& y, F- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {4 j% P0 z; t; P0 H; i% U* E8 x) k
- uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;
! N. l) e- }5 _3 u6 R( i3 }% I2 t - for (int j = 0; j < 8; ++j) {
5 {( w# v0 ~9 E& b" Z. a) [ - uint8 *p = dstBuf;
2 O" w8 _, _$ V/ `1 E' j - uint8 c = *chr++;; m0 i& Z* s3 {
- if (c != 0) {
3 v5 f6 j/ m& j: A6 H - for (int i = 0; i < 8; ++i) {1 s/ g! p* {$ k. E
- if (c & 0x80) {
1 `( C- _" ?9 B& r# Q - *p = color;
) O" C/ Y3 ^) |# E; b* U2 B+ X - }
: W8 `$ S& s9 V, e6 |2 E - ++p;
+ V/ ] j% p# B - c <<= 1;
# l/ t+ {4 T9 j9 j - }
m9 z+ K) x9 d; K# k1 K; \ - }6 b ~, I6 e- j$ q
- dstBuf += SCREEN_W;7 Z7 D5 ]: R6 W% m6 g
- }4 a# {5 D! \6 {( S
- }
复制代码 5 k1 Y% |% D" t' H! x
- t1 R" C! B7 q. T% E
9 i) J7 R9 N9 u. b* h5 w
) c, z# D9 t' V" R5 c5 H' G
& f9 N& m- V, U |