gohud

L'opacité — le jeu derrière le panneau

← Thématisation

Fenêtres surgissantes, boîtes de dialogue, feuilles, cartes, panneaux de HUD, alertes et snackbars dessinent leur face à 80 % d'opacité. Le combat continue derrière une demande de confirmation ; la carte se voit sous une feuille d'inventaire. Dans un jeu, ce n'est pas de la décoration — c'est ce qui garde le joueur orienté. Un panneau entièrement opaque efface l'endroit où il se tenait dès qu'une fenêtre s'ouvre.

Seule la face perd de son opacité. Le texte, les icônes, les boutons, les badges et les emplacements rapides restent nets, et les bordures et les ombres aussi. Un panneau translucide se lit comme du verre seulement tant que son contour est franc ; estompez le contour et l'on ne sait plus où le panneau s'arrête. Estompez le contenu et l'interface devient illisible — ce n'est pas une fenêtre transparente, c'est un bogue. C'est pourquoi la valeur n'est jamais appliquée via modulate.a.

Cinq couches, la plus précise en premier

OrdreUnitéPortée
l'argument passé à cet appel — surface.alpha, GoStyle.card(…, alpha)ratio 0.0–1.0une seule fenêtre
GoConfig.container_alpha_overrides[kind]ratio 0.0–1.0un type de panneau, dans tout le projet
GoConfig.metric_overrides[<kind>_alpha]pourcentageles projets qui gardent toutes les mesures au même endroit
GoConfig.container_alpharatio 0.0–1.0tous les panneaux d'un coup
le GoHud/constants/<kind>_alpha du thèmepourcentagece que décide l'apparence — la source de vérité

Si aucune n'est définie, la valeur vaut 100 : rien ne change pour un thème plus ancien.

L'opacité est un ratio partout — sauf dans le thème. Chaque champ et chaque argument alpha prend 0.0–1.0, les mêmes unités que Color.a et modulate.a, et une valeur négative signifie « non définie ». La seule exception, ce sont les constantes du thème, car une constante Theme ne peut pas contenir un flottant : celles-ci et le canal qui les remplace (metric_overrides, qui partage les noms et le type entier du thème) s'écrivent 80. Rien d'autre.
# Une seule fenêtre — une confirmation qui ne doit pas masquer le combat derrière elle
surface.alpha = 0.6
sheet.alpha = 0.7
dialogs.alpha = 0.9                          # les champs @export sont des ratios eux aussi
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)

# Par type — gardez le HUD presque opaque, car son texte se pose à même le monde
GoUi.config.container_alpha_overrides = {
    GoTheme.BOX_PANEL: 0.7,                   # les dialogues et les feuilles peuvent respirer
    GoTheme.BOX_HUD: 0.95,
}
GoUi.refresh()                               # redessine les widgets déjà ouverts

# Tout le projet — un monde chargé veut des panneaux redevenus opaques
GoUi.config.container_alpha = 1.0
GoUi.refresh()

GoUi.surface_alpha(GoTheme.BOX_PANEL)        # le ratio résolu, par ex. 0.8

Ce qui suit la valeur, et ce qui ne la suit pas

La suit — les conteneursL'ignore — ce sur quoi on appuie, et les marqueurs
GoSurface (la coque unique derrière les dialogues, les feuilles et les menus déroulants) · GoSheet · GoDialogs · GoDrawer · GoPopover · GoNotice · GoSnackbar · GoPromptCard · GoCoachMark · GoConsole tous les boutons · GoSlot (emplacements rapides) · GoBadge · les contrôles segmentés · les cellules de choix · les puces · les disques et les avatars
GoStyle.card() · hud_panel() · overlay_panel() · alert() · plate() · edge_card_panel() · style_notice_panel() · floating() · box() · surface() tout le texte et toutes les icônes

Un bouton dont l'état est délavé ne dit plus ce qu'il est, et un badge existe pour rendre deux caractères lisibles — ni l'un ni l'autre n'est un conteneur, donc ni l'un ni l'autre ne suit la valeur.

Les menus surgissants restent opaques (popup_alpha 100). Le moteur peut héberger un PopupMenu dans sa propre Window, et là le système ne le compose pas avec le jeu : la translucidité sort en noir au lieu de laisser voir au travers. Ne l'abaissez que dans les projets qui intègrent leurs sous-fenêtres (gui_embed_subwindows).

Trois détails qui viennent d'écrans réels

Les faces personnalisées s'estompent aussi — et c'est la part qui casse en silence

Le panneau à coins coupés (GoStyleBoxCut) et le cadre forgé (GoStyleBoxMedieval) ne sont pas des StyleBoxFlat ; ils se dessinent eux-mêmes. Mettez l'opacité seulement dans la branche plate et ces thèmes l'ignorent sans bruit alors que tous les tests portant sur des valeurs passent encore. Les deux estompent leur fond et gardent le halo, les rivets, la gravure d'angle et les reflets biseautés à pleine intensité — et le grain et le reflet biseauté de la face médiévale ont toujours été proportionnels à l'alpha de son fond : ils s'affinent donc en même temps que le panneau.

Ce qui mène au point plus large : bg_color.a == 0.8 est un nombre. Le monde se voit au travers et le texte reste lisible est l'exigence. gohud vérifie le nombre dans sa suite headless et l'exigence en dessinant des panneaux par-dessus des rayures diagonales sur un moniteur virtuel (tests/gohud_alpha_shot.gd) — sur la face plate, la face coupée et la face forgée, dans le thème sombre comme dans le thème clair.