Всплывающие окна, диалоги, листы, карточки, панели 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).
Три подробности, добытые на живых экранах
-
Значение умножает, а не заменяет. У лица HUD по умолчанию альфа уже 0.92, поэтому
hud_alpha80 даёт 0.736 — тема, намеренно сделавшая лицо полупрозрачным, сохраняет своё решение. Обратная сторона: примените его дважды — и панель погаснет дважды. Поэтому альфа умножается ровно в одном месте (GoSkin.surface_box()), а все остальные функции лица передают аргумент дальше, вместо того чтобы гасить собственный результат. -
Какой цвет передали, такой и получите.
GoStyle.plate(…, fill)сохраняет явную заливку ровно такой, какой её дали:Color(ink, 0.14)уже называет свою альфу, и домножение непрозрачности панели урезало бы замысел вызывающего второй раз.GoStyle.floating(…, opaque = true)игнорирует значение по той же причине — залить лицо плотно и есть весь смысл этого флага. -
Панели, которые собрал не gohud, живут по тому же правилу.
GoStyle.fade_panel(node)— после того как узел попал в дерево, чтобы он прочитал унаследованную тему. Вызов идемпотентен: исходное лицо запоминается, и каждый вызов пересчитывает от него, так что повторные перерисовки не накапливаются. После смены темыGoStyle.forget_face(node)сбрасывает эту память, и следующий вызов возьмёт уже новое лицо.
Собственные лица гаснут тоже — и именно здесь всё ломается молча
Панель со срезанными углами (GoStyleBoxCut) и кованая рамка
(GoStyleBoxMedieval) — не StyleBoxFlat: они рисуют себя сами. Положите
непрозрачность только в плоскую ветку — и эти темы тихо её проигнорируют, а все проверки по значениям
всё равно пройдут. Обе гасят свой фон и держат свечение, заклёпки, угловую гравировку и фаски в полную силу —
а фактура и фаска средневекового лица всегда были пропорциональны альфе его фона, поэтому они
бледнеют вместе с панелью.
Отсюда и более общий вывод: bg_color.a == 0.8 — это число. Мир просвечивает, а текст
по-прежнему читается — вот требование. Первое gohud проверяет набором тестов в headless-режиме,
второе — рисуя панели поверх диагональных полос на виртуальном мониторе
(tests/gohud_alpha_shot.gd): на плоском лице, на срезанном и на кованом, в тёмной теме и
в светлой.