gohud

HUD

← Виджеты

Вид решают мелочи

Вылизывайте крупные панели сколько угодно — глаз всё равно цепляется за мелочь: слово, разорванное надвое, обрезанное свечение, тесный слот. Четыре такие мелочи были указаны 2026-09-13 и исправлены в виджетах и темах, а не в демонстрационном экране, так что тот же результат получает каждый экран.

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

Давайте кнопкам без подписи описание через 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) используют кольцо, контрастное их собственной панели: тёмное в тёмной теме, белое в светлой, тёмная прицельная скобка в sci-fi. Проверка контраста измеряет кольцо фокуса относительно панели, на которой оно лежит, поэтому правило переживает смену палитры (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.