ポップアップ、ダイアログ、シート、カード、HUD パネル、アラート、スナックバーは、面を不透明度 80% で描く。確認ダイアログの背後では戦いが続き、インベントリのシートの下には地図が見えている。ゲームでは これは飾りではない — プレイヤーが自分の居場所を見失わずにいられる理由だ。完全に不透明なパネルは、 ウィンドウが開いたその瞬間に、プレイヤーが立っていた場所を消してしまう。
modulate.a を通しては決して適用されない。
5つの層、具体的なものから順に
| 順 | どこ | 単位 | 及ぶ範囲 |
|---|---|---|---|
| ① | その呼び出しの引数 — surface.alpha、GoStyle.card(…, alpha) | 比率 0.0–1.0 | 1つのウィンドウ |
| ② | GoConfig.container_alpha_overrides[kind] | 比率 0.0–1.0 | 1種類のパネル、プロジェクト全体で |
| ③ | GoConfig.metric_overrides[<kind>_alpha] | パーセント | 寸法をすべて1か所にまとめているプロジェクト |
| ④ | 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 と書かれる。ほかはどこもそうではない。
# 1つのウィンドウだけ — 背後の戦いを隠してはならない確認ダイアログ
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() |
すべての文字とアイコン |
状態が薄れたボタンは、自分が何であるかをもう伝えない。バッジは2文字を読ませるために存在する — どちらもコンテナではないから、どちらもこの値には従わない。
popup_alpha は 100)。エンジンは
PopupMenu を独立した Window に載せることがあり、そこでは OS がゲームと
合成してくれない — 半透明は透けるのではなく黒く出る。下げてよいのは、サブウィンドウを埋め込んでいる
プロジェクト(gui_embed_subwindows)だけだ。
実際の画面から分かった3つのこと
-
この値は掛かるのであって、置き換えるのではない。 既定の HUD の面はすでにアルファ 0.92 だから、
hud_alpha80 は 0.736 に着く — 面をわざと半透明にしたテーマは、その判断を保つ。 裏を返せば、2回かければパネルは2回薄くなる。だからアルファを掛けるのはただ1か所 (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 は前者をヘッドレスの検査で確かめ、後者を仮想モニタ上で斜めの縞
の上にパネルを描いて確かめる(tests/gohud_alpha_shot.gd)— フラットの面、面取りの面、
鍛造の面で、ダークとライトの両方のテーマで。