本帖最后由 shane007 于 2023-8-12 12:21 编辑
5 k+ E& {- k! A
$ [7 g6 {# c$ q4 J! P# E本游戏使用是高度为8像素的英文字库。0 M+ R# F g( K: `) m' Q
! k- \5 C) L. k
需要修改的点如下
# Y2 F7 G$ S+ P+ E/ }2 p《1》将显示函数中按照单字节移动的指针,变成支持双字节。
; u0 V9 g B. |7 B《2》在对话画面中,有时候需要显示4个对话选择项,4个选择项几乎是紧贴着的。2 e2 a- o% z* T( d6 a1 P( n: v1 ~
中文字库应该会选用12像素高度的字库,因此4个对话选择项显示的y坐标要做相应的改动。
: O8 }! S, P8 e9 o( l1 }" q+ j
[( B L7 e/ O7 m8 [对话显示函数
2 | B# X4 a* @此显示函数,先用8次1像素位移的方法,画上字符串的阴影,最后再画上字符全本身。这个显示方法,和断剑1,2 非常类似。' ~( T9 | n" d Q; {
- void Display::drawText(uint16 x, uint16 y, uint8 color, const char *text, bool outlined) {5 L+ `& j: @' H1 A- t' b
- static const int dx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };( w5 J6 n# V* t! d5 }: ~+ b7 i f/ W
- static const int dy[] = { -1, -1, -1, 0, 1, 1, 1, 0 };
, K$ M& |# O/ {; G8 c t - const uint8 *str = (const uint8 *)text;
- s8 c0 X$ E' k - uint16 xs = x;
6 I" h) r, X' L* ~, O7 @- B- Q. c - while (*str && x < SCREEN_W) {
% l J" e3 T; O' K/ K" g: x - const uint8 ch = *str++;
+ d7 O" A1 w6 A% j9 \) L - const uint8 *ftch = _font + ch * 8;3 h, Y) ?$ C. e- H# @
- if (outlined) {
. I T. _, r& J$ S - for (int i = 0; i < 8; ++i) {% f v( {9 Y! I7 b0 f3 o4 _
- drawChar(x + dx[i], y + dy[i], getInkColor(INK_OUTLINED_TEXT), ftch);2 S8 [, ~; O# v F8 V
- }
/ I' G0 D8 _5 N' `0 E! ]+ T/ k - }
; h9 x9 ^0 ?' f. V7 n+ Q: w: A - drawChar(x, y, color, ftch);
3 `+ ]) ]9 G3 ?2 r) B/ M0 m: @ - x += _charWidth[ch];/ r! C( a0 W' X) \4 M
- }
) p/ N8 C# [/ q) z3 k) c - setDirtyBlock(xs - 1, y - 1, x - xs + 2, 8 + 2);9 S( N# O0 I4 Z! n9 E9 ~
- }
复制代码 $ y- j5 ~( P) b- U& |; D+ N+ D
" m2 z+ b- j" v( K" L; r
单字符显示函数
* l+ A6 {& G! m6 m5 n. j, t- void Display::drawChar(uint16 x, uint16 y, uint8 color, const uint8 *chr) {
2 m" |2 S+ o+ p1 o5 _6 ^6 n) \ - uint8 *dstBuf = _screenBuf + SCREEN_W * y + x;: X0 Y1 l/ X& q8 `8 T+ c/ _
- for (int j = 0; j < 8; ++j) {
. v0 Y7 e7 p: i$ c& Z - uint8 *p = dstBuf;
/ d1 f% C) i$ v6 v2 { - uint8 c = *chr++;
4 t8 ^. G8 K" ?5 s- T - if (c != 0) {* A6 z* B7 ^" ?2 B Z4 @2 y, S
- for (int i = 0; i < 8; ++i) {6 e" `; D+ b7 f
- if (c & 0x80) {
7 J4 X; x4 |' P/ L - *p = color;- e Y5 r+ n$ U/ G0 K% w
- }- J! u. T9 Y z( _! H# g
- ++p;! t) h: \! D0 a
- c <<= 1;
K. j' A- B$ m& X7 s: M6 x - }4 ^1 V# ~' {# Q" O4 U! ~; Z
- }
2 `: }/ a: u$ {1 _$ B8 f2 e - dstBuf += SCREEN_W;) h% D' b4 L1 s4 g2 T) W
- }# T2 w$ G5 n. w' M1 h: T4 ~) q
- }
复制代码 6 i6 M0 ?: l# [8 o) c, t% L. D
' L7 s' h& `5 U" f; X+ F
8 e6 t/ u; z- i8 b4 {1 t: U
% X; {/ b) i: F
1 f; [* N. ~3 D+ U9 }3 G |