gohud

不透明度 — 面板背後的遊戲

← 佈景主題

彈出層、對話框、底部頁面、卡片、HUD 面板、行內提示與浮動訊息,它們的面都畫在 80% 不透明度上。 確認對話框後面的戰鬥還在打;庫存頁面底下的地圖還看得見。在遊戲裡這不是裝飾 — 是它讓玩家知道自己在哪裡。 完全不透明的面板,會在視窗打開的那一瞬間抹掉玩家原本站的地方。

只有面變淡。文字、圖示、按鈕、徽章與快捷格都保持清晰,邊框與陰影也是。 半透明的面板,只有在輪廓俐落時才讀得出玻璃感;輪廓一淡,就分不出面板到哪裡結束。 內容一淡,介面根本讀不了 — 那不是透明視窗,那是 bug。這就是為什麼這個值從來不透過 modulate.a 套用。

五層,由最明確的開始

順序在哪裡單位影響範圍
那次呼叫傳進去的參數 — surface.alphaGoStyle.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.amodulate.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,它們自己畫自己。把不透明度只寫進 flat 那條分支, 這兩套佈景主題就會默默忽略它,而所有看數值的測試照樣通過。兩者都會淡化自己的背景, 同時把光暈、鉚釘、角落雕刻與斜角維持在滿強度 — 而中世紀面的紋理與斜角本來就和它的背景 alpha 成正比,所以會跟著面板一起變淡。

說到底是這麼一回事:bg_color.a == 0.8 是一個數字。世界透得出來, 而文字依然讀得清楚才是要求。gohud 用無頭測試套件檢查前者,用虛擬螢幕把面板畫在 斜線條紋上檢查後者(tests/gohud_alpha_shot.gd)— 平面、斜切與鍛造三種面都測, 深色與淺色佈景主題也都測。