gohud

HUD

← Віджети

Дрібниці вирішують, чи має воно гарний вигляд

Вилизуйте великі панелі скільки завгодно — око завжди чіпляється за щось маленьке: розірване надвоє слово, зрізане сяйво, затиснутий слот. Чотири такі речі показали 13 вересня 2026 року, і полагоджено їх було у віджетах і темах, а не на екрані демо, тож той самий результат дістається кожному екрану.

Що виявилосяПричинаПолагоджено
Напис Done на коуч-мітці став Don/e Кнопка з увімкненим перенесенням віднімає ширину свого тексту від свого мінімуму — стисніть її, і вона розірветься всередині слова GoStyle.fit_words(): одне слово не переноситься ніколи; кілька слів переносяться, але найдовше слово вміщається завжди — рішення ухвалюється за показаним текстом, а не за ключем перекладу, і накладається наново формою, коли змінюється мова
У кнопки на всю ширину сяйво зрізалося по вертикалі зліва Контейнер прокрутки обрізає на своєму краю без винятків. Уцілів лише правий бік — завдяки жолобу для смуги прокрутки GoScroll позичає поле в батька, щоб відсунути свій край на 12dp назовні, і повертає його всередині — вміст лишається на місці
Час, іконка й кількість склалися в слоті стовпчиком Три рядки всередині 48dp Іконка велика по центру, гаряча клавіша вгорі зліва, кількість бейджем унизу справа, час, що лишився, — бейджем над іконкою; панелі бейджів приходять зі скінового badge_box()
Плаский випадний список без видимого вибору Наведення на пункт брало панель кнопки, а позначки-перемикачі були блідими типовими від рушія Окрема панель наведення (м'яке акцентне підфарбування), та сама графіка перемикачів, що й у прапорців, висота пункту під дотик
Відкритий випадний список — м'яка акцентна панель наведення й позначка обраного пункту
Випадний список — панель наведення й позначка вибору
Чотири швидкі слоти — гаряча клавіша вгорі зліва, бейдж кількості внизу справа, у першого — бейдж часу, що лишився
Слоти — кутові бейджі й час, що лишився (сай-фай)

Дайте кнопкам лише з іконкою опис через GoStyle.icon_button(icon, action, -1, tooltip_key) — і підказка для тих, хто з мишею, і назва для зчитувачів екрана беруться з цього одного значення. gohud малює підказку сам: типова від рушія розбиває текст по одному символу на рядок, коли її обчислення ширини йде не так (виміряно на ширині 1dp).

Картка коуч-мітки тримається осторонь нерухомого

У ландшафті картку раніше відсилало на самий верхній або нижній край — рівно туди, де живуть заголовки й частини HUD; у демо вона сіла на → × у заголовку. Тепер вона лишається на рівні своєї цілі, обходить будь-який GoHudAnchor, що резервує місце, і приймає інші перешкоди через keep_clear. Вона рухається на найкоротшу відстань, яка обходить перешкоду, не накриваючи ціль, і лишається на місці, коли екран замалий, щоб обійти все, — перекритися краще, ніж зникнути. Її глибина — щоб читалася як над сторінкою — береться з регуляторів скіна (float_shadow_size, float_shadow_lift, float_shadow_alpha; скіни зі зрізаними кутами беруть float_glow_size).

tour.keep_clear = [header_bar, toolbar]   # нерухомі елементи, що не є прив'язками

Екрани з мишею та клавіатурою

У пальця немає стану наведення. Будуйте лише під мобільні — і два стани, які бувають тільки на комп'ютері, лишаться неперевіреними; один із них таки був зламаний: у gohud кільце фокуса було невидиме на головній кнопці. Панель мала колір акценту, і кільце теж: 1,00:1, той самий колір, намальований сам на собі. Рухаючись клавіатурою, годі було зрозуміти, де ти.

Той самий ряд кнопок у трьох станах — звичайний, наведення мишею, фокус із клавіатури
Згори вниз: звичайний · наведення · фокус. Заліті кнопки дістають кільце, що контрастує з їхньою панеллю.

Заліті кнопки (GoPrimaryButton, GoDangerSolidButton) беруть кільце, яке контрастує з їхньою власною панеллю — темне в темній темі, біле у світлій, темна прицільна дужка в сай-фай. Перевіряльник контрасту вимірює кільце фокуса проти панелі, на якій воно лежить, тож правило переживає зміну палітри (WCAG 2.4.11 вимагає 3:1 для індикаторів фокуса).

Віджети HUD

GoHudAnchor — дев'ять місць

Шанує безпечну зону та крайові поля. Дайте йому landscape_spot — і він переїде в ландшафті: контроли, що в портреті сидять унизу по центру, можуть перейти вниз праворуч.

Навіщо це існує. Прописані вручну для кожної частини HUD прив'язки та зсуви розповзаються: смуга здоров'я опиняється під вирізом камери на пристрої з «чубчиком», а кнопка керування сідає на жестову смугу в ландшафті. Уся ця арифметика живе в одному місці.

Як не пускати вміст під HUD

Коли екран із прокруткою ділить дисплей із HUD, вміст з'їжджає під нього, і два набори тексту накладаються, доки жодного не можна прочитати. У цьому доповненні таке траплялося двічі: підказка поля вводу вичавлювалася між швидкими слотами, а повзунок перемикача в налаштуваннях сідав на смугу здоров'я.

form.avoid_hud = true                  # обходити кожен видимий GoHudAnchor
joystick_anchor.reserve_space = false  # …окрім тих, що з'являються лише під пальцем

Кожен прямокутник обходиться в тому напрямку, який коштує найменше площі. Смуга вгорі справа обходиться вниз на телефоні в портреті (13% висоти) і вбік у ландшафті (21% ширини) — обходити її по вертикалі в ландшафті коштувало б 27% екрана. Уже віддану площу віднімають, перш ніж міряти наступний прямокутник.

Частини HUD стикаються й між собою

Дев'ять місць ділять екран; вони не гарантують, що частини розминуться. Широкий снекбар угорі по центру сів просто на смугу здоров'я вгорі справа й затулив значення — годі було прочитати, скільки здоров'я лишилося.

notice_anchor.avoid_peers = true      # осідає під нерухомим HUD
notice_anchor.reserve_space = false   # і не штовхає сторінку, поки висить

Він відступає лише по вертикалі — відступ убік означав би, що центрований снекбар щоразу з'являється в іншому місці. І він обходить лише ті частини, які не відступають самі: якщо поступляться обидві, вони мінятимуться місцями довіку.

GoBar — здоров'я, мана, досвід

var hp := GoBar.new()
hp.label_text = "HP"
hp.ink = GoUi.color(GoTheme.DANGER_FILL)   # токен лише для заливки
hp.set_values(320, 500)                     # "320 / 500"

Зміни плавно йдуть за 0,18 с — смуга здоров'я, що стрибає, не каже, наскільки сильно вас вдарили. reduce_motion робить зміну миттєвою. Великі числа скорочуються до 12.3k, щоб ширина смуги не сіпалася, коли цифри приходять і йдуть.

GoSlot — один швидкий слот

Іконка, кількість, відкат і гаряча клавіша на одному лицьовому боці. Якщо чіпляти бейджі на маленьке коло, кожен слот виходить іншої ширини, і ряд хитається.

Видимий розмір і розмір дотику різні. У щільно складених слотів області дотику в 48dp перекриваються; перекриття дістається тому слоту, чий центр ближче — розкажіть їм одне про одного через touch_peers.

keyboard_focus типово вимкнено, щоб ряд із восьми слотів не стояв у порядку Tab між користувачем клавіатури й кожним контролом налаштувань. Вмикайте його, коли клавіатура чи геймпад — єдиний спосіб вводу.

GoJoystick — віртуальний стик

РежимПоведінка
FIXEDЗавжди на тому самому місці — легко знайти, не дивлячись
FOLLOWЗ'являється там, де ліг великий палець
RELATIVEПісля появи далі йде за пальцем — зручно для довгого руху

Vector2 із сигналу moved має довжину 0–1, тож його можна одразу множити на швидкість; він не залежить ні від розміру екрана, ні від DPI.

GoIconButton — виглядає малою, натискається великою

Безпечно лише доти, доки сусіди ігнорують ввід. Якщо розширена область накриє сусідню кнопку, та перестане відповідати. Іконковим кнопкам, що стоять поруч, потрібен touch_peers.