gohud

Непрозрачность — игра за панелью

← Темы

Всплывающие окна, диалоги, листы, карточки, панели HUD, оповещения и снекбары рисуют своё лицо с непрозрачностью 80%. Бой продолжается за диалогом подтверждения; карта видна под листом инвентаря. В игре это не украшение — именно так игрок не теряет, где он стоит. Полностью плотная панель стирает то место, на котором он стоял, в тот самый миг, когда открывается окно.

Прозрачным становится только лицо. Текст, иконки, кнопки, значки и быстрые слоты остаются чёткими, и вместе с ними — границы и тени. Полупрозрачная панель читается как стекло лишь до тех пор, пока её контур резок; ослабьте контур — и уже не понять, где панель кончается. Ослабьте содержимое — и интерфейс не прочитать вовсе: это не прозрачное окно, это ошибка. Именно поэтому значение никогда не применяется через modulate.a.

Пять слоёв, от самого частного

ПорядокГдеЕдиницаОхват
аргумент прямо в вызове — surface.alpha, GoStyle.card(…, alpha)доля 0.0–1.0одно окно
GoConfig.container_alpha_overrides[kind]доля 0.0–1.0один вид панелей во всём проекте
GoConfig.metric_overrides[<kind>_alpha]процентпроекты, которые держат все размеры в одном месте
GoConfig.container_alphaдоля 0.0–1.0все панели разом
GoHud/constants/<kind>_alpha в самой темепроцентто, что решает облик, — источник истины

Если не задан ни один из них, значение равно 100 — значит, в старой теме не меняется ничего.

Непрозрачность везде — доля, кроме как в теме. Любое поле alpha и любой аргумент принимают 0.0–1.0 — те же единицы, что у Color.a и modulate.a, а отрицательное значение означает «не задано». Единственное исключение — константы темы: константа Theme не умеет хранить дробное число, поэтому и они, и перекрывающий их канал (metric_overrides, у которого те же имена и тот же целочисленный тип, что у темы), записываются как 80. Больше нигде.
# Только одно окно — диалог подтверждения, который не должен закрыть бой за собой
surface.alpha = 0.6
sheet.alpha = 0.7
dialogs.alpha = 0.9                          # поля @export — тоже доли
drawer.alpha = 0.7
GoPopover.open(slot, body, {"alpha": 0.9})
var glass := GoStyle.card(Color.TRANSPARENT, -1.0, -1.0, -1.0, 0.5)

# По видам — HUD держим почти плотным, ведь его текст лежит прямо поверх мира
GoUi.config.container_alpha_overrides = {
    GoTheme.BOX_PANEL: 0.7,                   # диалогам и листам можно дышать
    GoTheme.BOX_HUD: 0.95,
}
GoUi.refresh()                               # перерисовывает уже открытые виджеты

# Весь проект — пёстрому миру панели нужны обратно плотными
GoUi.config.container_alpha = 1.0
GoUi.refresh()

GoUi.surface_alpha(GoTheme.BOX_PANEL)        # итоговая доля, например 0.8

Что следует за значением, а что нет

Следуют — контейнерыИгнорируют — то, что нажимают, и метки
GoSurface (единая оболочка за диалогами, листами и выпадающими списками) · GoSheet · GoDialogs · GoDrawer · GoPopover · GoNotice · GoSnackbar · GoPromptCard · GoCoachMark · GoConsole каждая кнопка · GoSlot (быстрые слоты) · GoBadge · сегментированные переключатели · ячейки выбора · чипы · круги и аватары
GoStyle.card() · hud_panel() · overlay_panel() · alert() · plate() · edge_card_panel() · style_notice_panel() · floating() · box() · surface() весь текст и все иконки

Кнопка с размытым состоянием перестаёт говорить, что она такое, а значок существует ради того, чтобы два символа читались. Ни то, ни другое не контейнер — значит, значению они и не следуют.

Всплывающие меню остаются плотными (popup_alpha 100). Движок может поселить PopupMenu в отдельном Window, а там система не смешивает его с игрой: полупрозрачность выходит чёрной, а не просвечивающей. Снижайте её только в проектах, которые встраивают свои подокна (gui_embed_subwindows).

Три подробности, добытые на живых экранах

Собственные лица гаснут тоже — и именно здесь всё ломается молча

Панель со срезанными углами (GoStyleBoxCut) и кованая рамка (GoStyleBoxMedieval) — не StyleBoxFlat: они рисуют себя сами. Положите непрозрачность только в плоскую ветку — и эти темы тихо её проигнорируют, а все проверки по значениям всё равно пройдут. Обе гасят свой фон и держат свечение, заклёпки, угловую гравировку и фаски в полную силу — а фактура и фаска средневекового лица всегда были пропорциональны альфе его фона, поэтому они бледнеют вместе с панелью.

Отсюда и более общий вывод: bg_color.a == 0.8 — это число. Мир просвечивает, а текст по-прежнему читается — вот требование. Первое gohud проверяет набором тестов в headless-режиме, второе — рисуя панели поверх диагональных полос на виртуальном мониторе (tests/gohud_alpha_shot.gd): на плоском лице, на срезанном и на кованом, в тёмной теме и в светлой.