Những thứ nhỏ mới quyết định nó có đẹp hay không
Bạn có gọt giũa các tấm nền lớn đến đâu đi nữa — thứ đập vào mắt luôn là một chi tiết nhỏ: một từ bị cắt làm đôi, một vệt sáng bị xén mất, một cái ô chật chội. Bốn chuyện như vậy được chỉ ra vào 2026-09-13 và đã sửa ngay trong widget và theme, không sửa ở màn hình demo, nên mọi màn hình đều được kết quả như nhau.
| Hiện tượng | Nguyên nhân | Cách sửa |
|---|---|---|
Chữ Done trên coach mark thành Don/e |
Một cái nút đang bật xuống dòng sẽ trừ bề rộng chữ của nó khỏi bề rộng tối thiểu — bóp lại là nó gãy ngay giữa từ | GoStyle.fit_words(): một từ thì không bao giờ xuống dòng; nhiều từ thì xuống dòng, nhưng từ dài nhất luôn vừa — xét trên chữ được hiển thị chứ không phải khóa dịch, và biểu mẫu áp lại khi đổi ngôn ngữ |
| Vệt sáng của một nút rộng hết khung bị cắt dọc ở cạnh trái | Một container cuộn thì cắt ở mép của nó, không có ngoại lệ. Chỉ bên phải sống sót, nhờ khoảng chừa cho thanh cuộn | GoScroll mượn phần đệm của cha để đẩy mép của nó ra 12dp rồi trả lại vào trong — nội dung không xê dịch |
| Thời gian, biểu tượng và số lượng xếp chồng theo chiều dọc trong một ô | Ba hàng nhồi trong 48dp | Biểu tượng to ở giữa, phím tắt góc trên bên trái, số lượng là một badge ở góc dưới bên phải, thời gian còn lại là một badge đè lên biểu tượng — tấm nền của badge lấy từ badge_box() của skin |
| Một danh sách thả xuống phẳng lì, không thấy mục nào đang chọn | Mục đang rê chuột dùng tấm nền của nút; dấu chọn tròn là mặc định nhợt nhạt của engine | Một tấm nền rê chuột riêng (pha nhẹ màu nhấn), dấu chọn tròn vẽ giống hộp kiểm, chiều cao mỗi mục đủ cho ngón tay |
Hãy cho những nút chỉ có biểu tượng một lời mô tả bằng GoStyle.icon_button(icon, action, -1, tooltip_key) —
tooltip cho người dùng chuột và tên dành cho trình đọc màn hình đều lấy từ đúng một giá trị đó.
gohud tự vẽ tooltip: bản mặc định của engine cắt chữ thành mỗi dòng một ký tự khi
phép tính bề rộng của nó sai (đo được là rộng 1dp).
Thẻ coach mark biết tránh các vật cố định
Khi màn hình nằm ngang, tấm thẻ trước đây bị đẩy ra sát mép trên hoặc mép dưới — đúng chỗ phần đầu trang và các
mảnh HUD ngồi; trong bản demo nó đè lên cụm → × của đầu trang. Giờ nó giữ ngang tầm với mục tiêu,
bước tránh mọi GoHudAnchor có giữ chỗ, và nhận thêm những thứ khác cần né qua
keep_clear. Nó dịch đi quãng ngắn nhất đủ thoát vật cản mà không che mất mục tiêu, và đứng
yên khi màn hình quá nhỏ để né hết — chồng lên nhau vẫn hơn biến mất.
Chiều sâu của nó — để đọc ra là nổi trên trang — đến từ các núm chỉnh của skin
(float_shadow_size, float_shadow_lift, float_shadow_alpha; skin vát góc thì dùng float_glow_size).
tour.keep_clear = [header_bar, toolbar] # các vật cố định không phải là anchor
Màn hình có chuột và bàn phím
Ngón tay thì không có trạng thái rê chuột. Chỉ làm cho di động thôi là hai trạng thái riêng của máy để bàn
chẳng ai kiểm — và một trong hai đã hỏng: vòng focus của gohud vô hình trên nút chính. Tấm nền
mang màu nhấn còn vòng focus cũng vậy: 1.00:1, cùng một màu vẽ chồng lên chính nó. Di chuyển
bằng bàn phím thì không cách nào biết mình đang ở đâu.
Nút tô đặc (GoPrimaryButton, GoDangerSolidButton) dùng một vòng focus
tương phản với chính tấm nền của nó — tối trên theme tối, trắng trên theme sáng, một khung ngắm góc
tối ở bản sci-fi. Bộ kiểm tra tương phản đo vòng focus so với tấm nền nó nằm lên, nên
quy tắc này sống sót qua một lần đổi bảng màu (WCAG 2.4.11 yêu cầu 3:1 cho chỉ báo focus).
Các widget HUD
GoHudAnchor — chín vị trí
Tôn trọng vùng an toàn và lề mép màn hình. Cho nó một landscape_spot thì nó đổi chỗ khi màn hình
nằm ngang — những control nằm giữa đáy lúc màn hình dọc có thể dời sang góc dưới bên phải.
Giữ cho nội dung không chui xuống dưới HUD
Khi một màn hình cuộn được phải chia màn hình với HUD, nội dung trượt xuống bên dưới nó và hai lớp chữ chồng lên nhau đến mức chẳng đọc nổi bên nào. Chuyện đó đã xảy ra hai lần trong add-on này: chữ gợi ý của một ô nhập bị kẹt giữa các ô nhanh, và núm của một công tắc trong phần cài đặt rơi trúng thanh máu.
form.avoid_hud = true # tránh mọi GoHudAnchor đang hiện
joystick_anchor.reserve_space = false # …trừ những cái chỉ hiện ra dưới ngón tay
Mỗi hình chữ nhật được né theo hướng tốn ít diện tích nhất. Một thanh ở góc trên bên phải thì được bước tránh xuống dưới trên điện thoại dọc (13% chiều cao) và sang ngang khi nằm ngang (21% chiều rộng) — né nó theo chiều dọc lúc nằm ngang sẽ tốn 27% màn hình. Phần đất đã nhường rồi thì được trừ ra trước khi đo tới hình chữ nhật kế tiếp.
Các mảnh HUD cũng va vào nhau
Chín vị trí chia màn hình ra; chúng không bảo đảm các mảnh không đụng nhau. Một snackbar rộng ở giữa mép trên đã đáp thẳng lên thanh máu ở góc trên bên phải, che mất con số — bạn không đọc nổi mình còn bao nhiêu máu.
notice_anchor.avoid_peers = true # nằm xuống dưới HUD cố định
notice_anchor.reserve_space = false # và không đẩy trang trong lúc nó đang hiện
Nó chỉ bước tránh theo chiều dọc — dịch cả sang ngang nữa thì một thông báo canh giữa sẽ hiện ra ở một chỗ khác nhau mỗi lần. Và nó chỉ né những mảnh không tự bước tránh: nếu cả hai cùng nhường, hai bên sẽ đổi chỗ cho nhau mãi mãi.
GoBar — máu, mana, kinh nghiệm
var hp := GoBar.new()
hp.label_text = "HP"
hp.ink = GoUi.color(GoTheme.DANGER_FILL) # token chỉ dùng để tô
hp.set_values(320, 500) # "320 / 500"
Thay đổi chạy mượt trong 0,18 giây — một thanh máu nhảy phắt một cái thì không cho bạn biết cú đánh vừa rồi
nặng đến đâu. reduce_motion làm nó đổi tức thì. Số lớn được rút gọn thành 12.3k để
bề rộng của thanh không giật lên giật xuống theo số chữ số.
GoSlot — một ô nhanh
Biểu tượng, số lượng, hồi chiêu và phím tắt trên cùng một mặt. Treo badge lủng lẳng quanh một vòng tròn nhỏ sẽ làm mỗi ô một bề rộng khác nhau và cả hàng lắc lư.
touch_peers.
keyboard_focus mặc định tắt, nên một hàng tám ô nhanh không chen giữa người dùng bàn phím và
mọi control cài đặt trong thứ tự Tab. Hãy bật nó khi bàn phím hoặc tay cầm là cách nhập liệu duy nhất.
GoJoystick — cần điều khiển ảo
| Chế độ | Hành vi |
|---|---|
FIXED | Luôn ở đúng một chỗ — dễ tìm mà không cần nhìn |
FOLLOW | Hiện ra ngay nơi ngón cái chạm xuống |
RELATIVE | Sau khi hiện ra thì tiếp tục đi theo ngón cái — thoải mái cho những đoạn di chuyển dài |
Vector2 mà tín hiệu moved trả về có độ dài từ 0 đến 1, nên bạn nhân thẳng nó
vào tốc độ được; nó không đổi theo kích thước màn hình hay DPI.
GoIconButton — trông nhỏ, bấm rộng
touch_peers.