gohud

HUD

← Widżety

O tym, czy wygląda dobrze, decydują drobiazgi

Dopieszczaj duże panele, ile chcesz — w oczy i tak rzuca się zawsze coś małego: słowo przełamane na pół, ucięta poświata, ciasny slot. Cztery takie rzeczy wskazano 2026-09-13 i naprawiono je w widżetach i motywach, a nie na ekranie demo, więc każdy ekran dostaje ten sam efekt.

Co się pokazałoPrzyczynaNaprawa
Napis Done na wskazówce instruktażowej zmienił się w Don/e Przycisk z włączonym zawijaniem odejmuje szerokość swojego tekstu od minimum — ściśnij go, a złamie się w środku słowa GoStyle.fit_words(): jedno słowo nigdy się nie zawija; kilka słów zawija się, ale najdłuższe słowo zawsze się mieści — sądzone po tekście wyświetlanym, a nie po kluczu tłumaczenia, i nakładane ponownie przez formularz przy zmianie języka
Poświata przycisku na pełną szerokość została ucięta pionowo po lewej Kontener przewijania przycina na swojej krawędzi, bez wyjątków. Przetrwała tylko prawa strona, dzięki rynience na pasek GoScroll pożycza margines rodzica, by wypchnąć swoją krawędź o 12 dp na zewnątrz, i oddaje go w środku — treść zostaje na miejscu
Czas, ikona i liczba ustawiły się w slocie jedno pod drugim Trzy rzędy wewnątrz 48 dp Ikona duża na środku, skrót w lewym górnym rogu, liczba jako plakietka w prawym dolnym, pozostały czas jako plakietka na ikonie — panele plakietek pochodzą z badge_box() skórki
Płaska lista rozwijana bez widocznego zaznaczenia Najechanie na pozycję używało panelu przycisku; znaczniki wyboru były bladą domyślną grafiką silnika Dedykowany panel najechania (miękkie zabarwienie akcentem), ta sama grafika przycisku radiowego co przy polach wyboru, wysokość pozycji dobrana pod dotyk
Otwarta lista rozwijana — miękki panel najechania w kolorze akcentu i znacznik wyboru przy wybranej pozycji
Lista rozwijana — panel najechania i znacznik wyboru
Cztery szybkie sloty — skrót w lewym górnym rogu, plakietka z liczbą w prawym dolnym, pierwszy z plakietką pozostałego czasu
Sloty — plakietki narożne i pozostały czas (sci-fi)

Daj przyciskom z samą ikoną opis przez GoStyle.icon_button(icon, action, -1, tooltip_key) — podpowiedź dla użytkowników myszy i nazwa dostępności dla czytników ekranu biorą się z tej jednej wartości. gohud rysuje podpowiedź sam: domyślna z silnika łamie tekst po jednym znaku na linię, gdy jego obliczenie szerokości idzie źle (zmierzone przy 1 dp szerokości).

Karta wskazówki trzyma się z dala od stałych elementów

W orientacji poziomej karta trafiała kiedyś na samą górną albo dolną krawędź — dokładnie tam, gdzie mieszkają nagłówki i elementy HUD; w demie siadała na → × nagłówka. Teraz trzyma się na wysokości swojego celu, omija każdy GoHudAnchor, który rezerwuje miejsce, a inne rzeczy do omijania przyjmuje przez keep_clear. Przesuwa się o najkrótszy dystans, który uwalnia przeszkodę, nie zasłaniając celu, i zostaje na miejscu, gdy ekran jest za mały, by uwolnić wszystko — nachodzenie jest lepsze niż znikanie. Jej głębia — żeby czytała się jako ponad stroną — pochodzi z pokręteł skórki (float_shadow_size, float_shadow_lift, float_shadow_alpha; skórki ze ściętymi narożnikami używają float_glow_size).

tour.keep_clear = [header_bar, toolbar]   # stałe elementy, które nie są kotwicami

Ekrany z myszą i klawiaturą

Palec nie ma stanu najechania. Buduj wyłącznie pod urządzenia mobilne, a dwa stany występujące tylko na komputerze zostaną niesprawdzone — i jeden z nich był zepsuty: pierścień fokusu gohud był niewidoczny na przycisku głównym. Panel miał kolor akcentu i pierścień też: 1.00:1, ten sam kolor narysowany sam na sobie. Poruszając się klawiaturą, nie dało się poznać, gdzie się jest.

Ten sam rząd przycisków w trzech stanach — zwykłym, najechania myszą i fokusu klawiatury
Od góry do dołu: zwykły · najechanie · fokus. Wypełnione przyciski dostają pierścień kontrastujący z ich panelem.

Wypełnione przyciski (GoPrimaryButton, GoDangerSolidButton) używają pierścienia, który kontrastuje z ich własnym panelem — ciemnego w ciemnym motywie, białego w jasnym, ciemnej ramki celowniczej w sci-fi. Kontroler kontrastu mierzy pierścień fokusu względem panelu, na którym leży, więc reguła przeżywa zmianę palety (WCAG 2.4.11 wymaga 3:1 dla wskaźników fokusu).

Widżety HUD

GoHudAnchor — dziewięć miejsc

Szanuje bezpieczny obszar i marginesy przy krawędziach. Daj mu landscape_spot, a przesunie się w orientacji poziomej — kontrolki, które w pionie siedzą na dole pośrodku, mogą trafić na dół po prawej.

Po co istnieje. Pisane ręcznie dla każdego elementu HUD, kotwice i przesunięcia się rozjeżdżają: pasek zdrowia ląduje pod wycięciem kamery na urządzeniu z notchem, a przycisk sterowania siada na pasku gestów w orientacji poziomej. Ta arytmetyka mieszka w jednym miejscu.

Jak trzymać treść spod HUD

Gdy przewijany ekran dzieli wyświetlacz z HUD, treść wsuwa się pod niego i oba zestawy tekstu nachodzą na siebie, aż żadnego nie da się odczytać. W tym dodatku zdarzyło się to dwa razy: tekst zastępczy pola wprowadzania wyciskał się między szybkimi slotami, a gałka przełącznika w ustawieniach lądowała na pasku zdrowia.

form.avoid_hud = true                  # omijaj każdy widoczny GoHudAnchor
joystick_anchor.reserve_space = false  # …poza tymi, które pojawiają się dopiero pod palcem

Każdy prostokąt omijany jest w tym kierunku, który kosztuje najmniej powierzchni. Pasek w prawym górnym rogu omijany jest w dół na telefonie w pionie (13% wysokości) i na bok w poziomie (21% szerokości) — omijanie go pionowo w orientacji poziomej kosztowałoby 27% ekranu. Oddany już teren odejmuje się, zanim zmierzony zostanie następny prostokąt.

Elementy HUD zderzają się także ze sobą

Dziewięć miejsc dzieli ekran; nie gwarantuje, że elementy miną się wzajemnie. Szeroki snackbar na górze pośrodku wylądował dokładnie na pasku zdrowia w prawym górnym rogu i zasłonił wartość — nie dało się odczytać, ile zdrowia zostało.

notice_anchor.avoid_peers = true      # osiada pod stałym HUD
notice_anchor.reserve_space = false   # i nie przesuwa strony, dopóki jest widoczny

Ustępuje tylko w pionie — przesuwanie się także na boki sprawiłoby, że wyśrodkowane powiadomienie pojawiałoby się za każdym razem gdzie indziej. I omija wyłącznie te elementy, które same nie ustępują: gdyby ustąpiły oba, w nieskończoność zamieniałyby się miejscami.

GoBar — zdrowie, mana, doświadczenie

var hp := GoBar.new()
hp.label_text = "HP"
hp.ink = GoUi.color(GoTheme.DANGER_FILL)   # token tylko do wypełnień
hp.set_values(320, 500)                     # "320 / 500"

Zmiany wygładzają się przez 0,18 s — pasek zdrowia, który przeskakuje, nie mówi ci, jak mocno oberwałeś. reduce_motion sprawia, że zmiana jest natychmiastowa. Duże liczby skracają się do 12.3k, więc szerokość paska nie drga, gdy cyfry przybywają i ubywają.

GoSlot — jeden szybki slot

Ikona, liczba, odnowienie i skrót na jednym licu. Wieszanie plakietek na małym kółku sprawia, że każdy slot ma inną szerokość, a rząd faluje.

Rozmiar widoczny i rozmiar dotyku to co innego. Ciasno upakowane sloty mają nachodzące na siebie pola dotyku 48 dp; część wspólna przypada temu slotowi, którego środek jest bliżej — powiedz im o sobie nawzajem przez touch_peers.

keyboard_focus jest domyślnie wyłączony, żeby rząd ośmiu slotów nie stanął w kolejności Tab między użytkownikiem klawiatury a wszystkimi kontrolkami ustawień. Włącz go, gdy klawiatura albo pad są jedynym wejściem.

GoJoystick — wirtualny joystick

TrybZachowanie
FIXEDZawsze w tym samym miejscu — łatwo trafić bez patrzenia
FOLLOWPojawia się tam, gdzie ląduje kciuk
RELATIVEPo pojawieniu się nadal podąża za kciukiem — wygodne przy długim ruchu

Vector2 z sygnału moved ma długość 0–1, więc możesz przemnożyć go wprost przez prędkość; nie zmienia się wraz z rozmiarem ekranu ani DPI.

GoIconButton — wygląda na mały, naciska się duży

Bezpieczny tylko dopóki jego rodzeństwo ignoruje wejście. Jeśli poszerzony obszar zakryje sąsiedni przycisk, ten przestanie odpowiadać. Przyciski z ikonami stojące obok siebie potrzebują touch_peers.