本帖最后由 shane007 于 2023-8-12 12:21 编辑 : d3 g- E- A7 n, y2 g* T
8 N4 a/ \9 p8 T: |4 I* N0 _
本游戏使用是高度为8像素的英文字库。. G: X* v$ @7 A' L
' S% _, q9 j0 N3 }2 t W# c
需要修改的点如下: W# }& k1 H! o0 D8 q' P: f& n0 E3 F' H
《1》将显示函数中按照单字节移动的指针,变成支持双字节。
8 u8 M& s! s# @0 x《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。9 n- {8 t7 x9 E8 R+ i
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
, r: {6 Z2 T2 x/ a. H* F/ V& L2 q% m# U
对话显示函数# M: H( P& _ I4 V' G
此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。
$ _+ {* i4 S& z* Y1 V- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {
' m' S r7 c/ @7 c$ \ m$ P8 l - static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
/ L5 }! |3 }# z" o1 u" X - static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };! D8 _; [9 w$ |
- const uint8 *str = (const uint8 *)text;
6 g+ o* ^0 z' i: z, \ - uint16 xs = x;+ j- U B- C7 r% |+ }
- while (*str && x < SCREEN_W) {5 L7 U+ S, T* }/ N! r
- const uint8 ch = *str++;
w' a# o0 b ] - const uint8 *ftch = _font + ch * 8;- F2 D6 F% I4 ]0 S& n
- if (outlined) {- N; [' z. A0 Q0 s) ?6 m, B4 ^
- for (int i = 0; i < 8; ++i) {' T2 g& `& N. h; L2 F
- drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);
/ [) ]! [! p& K( ^4 S f - }. y- g( x$ G" @+ X* u
- }
* `2 R6 Z5 F5 R, z - drawChar(x, y, color, ftch);
( {. S/ r5 q' D. }( D0 ] ] - x += _charWidth[ch];
! J3 q8 k/ b8 ] - }
* k5 B. H$ ~. p% @ - setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2); P6 v# g- c: e F
- }
复制代码 - z8 @7 R p; F" p5 V; J$ C
" f# [& H, `, x$ S, b9 w
单字符显示函数
' X. C. Y. L0 T% L- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
9 W+ T& b4 m9 C' |; S+ m - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x; ~8 L8 w$ T: U% s% l7 w
- for (int j = 0; j < 8; ++j) {( B( G, L8 ]0 B' q+ E6 O' u
- uint8 *p = dstBuf;& f/ i/ T( U5 G0 e1 D
- uint8 c = *chr++;
+ d2 F7 \ h+ t; b1 u8 X. x - if (c != 0) {% y4 a4 y, w$ W/ _8 O# h0 u
- for (int i = 0; i < 8; ++i) {
' _) c3 `( J9 _( K9 h0 w - if (c & 0x80) {6 S# }9 t! Q4 j
- *p = color;8 s/ y8 j" G0 t% G% x/ o
- }
* {0 R2 _8 `$ C* v/ I2 \' f - ++p;" W5 O, L# n) ~
- c <<= 1;5 t$ R: N# { \* K
- }
/ P$ }/ @& d: W1 e1 y, ~ - }# x2 z5 a6 K* L7 R. v
- dstBuf += SCREEN_W;
' v/ }6 ?4 v$ p8 v - }
7 \- t8 @$ t9 u, A+ v" l - }
复制代码
( v; K2 ^6 i! _2 ~5 L
0 E! ?2 ]. ?; _+ W0 J1 H1 x7 ], G" ? z. T- @4 r7 Z. p
% h! N, A t# {7 c& ^: I- h, S7 \; |* f) O! m) ^4 J% j
|