gohud

HUD

← Widget

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ượngNguyên nhânCá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
Một danh sách thả xuống đang mở — tấm nền rê chuột pha nhẹ màu nhấn và dấu chọn tròn của mục đã chọn
Danh sách thả xuống — tấm nền rê chuột và dấu chọn tròn
Bốn ô nhanh — phím tắt góc trên bên trái, badge số lượng góc dưới bên phải, ô đầu tiên có badge thời gian còn lại
Ô nhanh — badge ở góc và thời gian còn lại (sci-fi)

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.

Vẫn hàng nút đó ở ba trạng thái — bình thường, rê chuột, focus bàn phím
Từ trên xuống: bình thường · rê chuột · focus. Nút tô đặc nhận một vòng focus tương phản với tấm nền của nó.

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.

Vì sao có nó. Viết tay cho từng mảnh HUD thì anchor và offset sẽ lệch dần: thanh máu chui xuống dưới lỗ khoét camera trên máy có tai thỏ, còn một nút điều khiển thì rơi vào thanh cử chỉ khi màn hình nằm ngang. Phép tính đó nằm gọn ở một chỗ.

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ư.

Cỡ nhìn thấy và cỡ chạm là hai thứ khác nhau. Các ô xếp sát nhau có vùng chạm 48dp chồng lên nhau; phần chồng lấn thuộc về ô nào có tâm gần hơn — hãy cho chúng biết về nhau qua 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
FIXEDLuôn ở đúng một chỗ — dễ tìm mà không cần nhìn
FOLLOWHiện ra ngay nơi ngón cái chạm xuống
RELATIVESau 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

Chỉ an toàn khi các nút bên cạnh bỏ qua thao tác. Nếu vùng đã nới rộng phủ lên nút kế bên, nút đó sẽ không còn phản hồi. Các nút biểu tượng đặt sát nhau cần touch_peers.