떠 있는 창, 확인창, 시트, 카드, 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 에 띄우기도 하는데, 거기서는 OS 가 게임과 합성하지 않는다 — 반투명이 비쳐
보이는 대신 검게 나온다. 서브 창을 게임 안에 품는 프로젝트(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 이 아니다. 스스로 그린다. 불투명도를 flat 분기에만 넣어 두면 이 테마들은
말없이 그것을 무시하는데, 값을 재는 검사는 하나도 빠짐없이 통과한다. 둘 다 배경만 옅게 하고 발광·리벳·
모서리 각인·베벨은 제 세기로 남긴다 — 중세 면의 질감과 베벨은 원래부터 배경 알파에 비례했으므로
패널을 따라 함께 옅어진다.
여기서 더 넓은 이야기가 나온다. bg_color.a == 0.8 은 숫자다. 세계가 비쳐 보이고
글자는 여전히 읽힌다 가 요구다. gohud 는 앞의 것을 헤드리스 검사 스위트로 재고, 뒤의 것은
가상 모니터에서 사선 줄무늬 위에 패널을 그려 확인한다(tests/gohud_alpha_shot.gd) —
flat 면·자른 면·단조 면 각각, 어두운 테마와 밝은 테마 양쪽에서.