卡①T1(组合根注册面批): ui_registry+三域容器建件——UiRegistry(LAYER_CONTRACT逐字迁入+node(key)19键match+apply_layer_contract唯一落位口)/UiScreens(9句柄)/UiBattle(5句柄)/UiModals(13句柄+flow+register_layer逐字迁入);四件全RefCounted零信号连接;类缓存刷新+.uid同步;S9/S13零新键+source_guard绿
This commit is contained in:
1 parent
c8f5091d0f
commit
bee0682f4c
8 files changed
+158
No files matched your search
@@ -0,0 +1,10 @@
|
||||
## 战区视图域句柄册:战斗屏 A–D 区视图与结算演出覆盖层的注册面域容器。
|
||||
## 纯字段无方法;RefCounted 不挂树——节点本体树位与 add_child 归属由组合根与装配承接件负责。
|
||||
class_name UiBattle
|
||||
extends RefCounted
|
||||
|
||||
var stage: BattleStageView # B 区(含 log_view 明细带)
|
||||
var log_view: BattleLogView
|
||||
var info_panel: HeroInfoPanelView # C 区(攻击/AC 数据框+两预留区)
|
||||
var board_zone: BoardZoneView # D 区(含 ap_bar/board_view/toast/fx)
|
||||
var settlement_fx: SettlementFxView # 结算演出覆盖层(跨区弹道/光带——A–D 之上、模态之下)
|
||||
@@ -0,0 +1 @@
|
||||
uid://d35j5hry1f40v
|
||||
@@ -0,0 +1,27 @@
|
||||
## 模态层域句柄册:十三个模态覆盖层句柄+模态栈编排(ModalFlow——登记/开合/输入锁谓词)的注册面域容器。
|
||||
## RefCounted 不挂树;模态登记唯一口=register_layer(anchors 撑满宿主+排入 ModalStack)。
|
||||
class_name UiModals
|
||||
extends RefCounted
|
||||
|
||||
var flow: ModalFlow
|
||||
var legend_overlay: LegendOverlay
|
||||
var node_overlay: NodeOverlay
|
||||
var level_screen: LevelMapScreen
|
||||
var curio_overlay: CurioPickOverlay
|
||||
var end_overlay: BattleEndOverlay
|
||||
var shop_overlay: ShopOverlay
|
||||
var camp_overlay: CampOverlay
|
||||
var settings_overlay: SettingsOverlay
|
||||
var status_panel: StatusPanel
|
||||
var career_overlay: CareerOverlay
|
||||
var save_select_overlay: SaveSelectOverlay
|
||||
var confirm_dialog: ConfirmDialog
|
||||
var debug_overlay: DebugOverlay
|
||||
|
||||
|
||||
func register_layer(m: Control, tags: Array = []) -> void:
|
||||
# 撑满宿主(Control 默认锚 = 0×0——全屏变暗层与居中布局整体失效;route 选路层预览截图实证后
|
||||
# 统一收口:六个模态同病,探针经信号直发绕过真实点击从未暴露。anchors_and_offsets 而非 anchors
|
||||
# ——后者会把控件重置回最小内容尺寸,ui_assembler 头注同款纪律)
|
||||
m.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
||||
flow.register(m, tags) # 排除组随层登记(non_locking=调试浮窗/screen_state=关卡地图屏)
|
||||
@@ -0,0 +1 @@
|
||||
uid://dbs4qveqvr5hg
|
||||
@@ -0,0 +1,101 @@
|
||||
## 界面注册面:呈现层界面元素清单的唯一事实源——哪些层、什么序、地址在哪。
|
||||
## 持有三域容器(screens/battle/modals)、LAYER_CONTRACT 合同表、node(key) 合同寻址、
|
||||
## apply_layer_contract(root) 唯一落位口(全仓唯一 move_child 点)。
|
||||
## RefCounted 不挂树:零信号连接、零会话期引用、零核心写调用——组合根单点装配不变。
|
||||
class_name UiRegistry
|
||||
extends RefCounted
|
||||
|
||||
const ModalStack := preload("res://presentation/modal_stack.gd")
|
||||
|
||||
# ==================== 视觉层合同(唯一事实源——树序=登记序=z 序;改序只改此表) ====================
|
||||
# kind: shell=屏壳容器(成员随壳不占独立树位;level_screen 例外另占登记位)/modal=模态层(入登记册,
|
||||
# tags 随登记)/state=全屏态(占树位不入登记册)/node=非视觉节点(占树位不入登记册)。
|
||||
# host=宿住屏壳(树序随宿主、登记序按本合同);shell=模态成员的屏壳(成员与屏壳同槽:屏壳占该树位、
|
||||
# 成员占该登记位)。落位=apply_layer_contract(全仓唯一层序落位点,add_child 之后统一排序+登记)。
|
||||
const LAYER_CONTRACT: Array[Dictionary] = [
|
||||
{"key": "adventure_screen", "kind": "shell"},
|
||||
{"key": "menu_screen", "kind": "shell"},
|
||||
{"key": "row_pacer", "kind": "node"},
|
||||
{"key": "legend_overlay", "kind": "modal", "tags": []},
|
||||
{"key": "node_overlay", "kind": "modal", "tags": []},
|
||||
{"key": "level_screen", "kind": "modal", "tags": [ModalStack.TAG_SCREEN_STATE], "host": "adventure_screen"},
|
||||
{"key": "curio_overlay", "kind": "modal", "tags": []},
|
||||
{"key": "end_overlay", "kind": "modal", "tags": []},
|
||||
{"key": "shop_overlay", "kind": "modal", "tags": []},
|
||||
{"key": "camp_overlay", "kind": "modal", "tags": [], "shell": "camp_screen"},
|
||||
{"key": "settings_overlay", "kind": "modal", "tags": []},
|
||||
{"key": "status_panel", "kind": "modal", "tags": []},
|
||||
{"key": "career_overlay", "kind": "modal", "tags": []},
|
||||
{"key": "save_select_overlay", "kind": "modal", "tags": []}, # 选档界面(营地交互重做卡③——登记生涯同档)
|
||||
{"key": "inter_overlay", "kind": "state", "tags": []},
|
||||
{"key": "confirm_dialog", "kind": "modal", "tags": []},
|
||||
{"key": "debug_overlay", "kind": "modal", "tags": [ModalStack.TAG_NON_LOCKING]},
|
||||
{"key": "debug_badge", "kind": "float"}, # 调试入口全局浮层——末位=最顶绘制序;
|
||||
# float 类不注册 ModalStack(open() 遮挡记账只隐藏登记层)→ 任何 UI 打开都不遮它
|
||||
]
|
||||
|
||||
var screens: UiScreens
|
||||
var battle: UiBattle
|
||||
var modals: UiModals
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
screens = UiScreens.new()
|
||||
battle = UiBattle.new()
|
||||
modals = UiModals.new()
|
||||
|
||||
|
||||
# 合同层寻址(key→节点;纯查表不含层序语义——层序唯一事实源=LAYER_CONTRACT)
|
||||
func node(key: String) -> Node:
|
||||
match key:
|
||||
"adventure_screen": return screens.adventure_screen
|
||||
"menu_screen": return screens.menu_screen
|
||||
"row_pacer": return screens.row_pacer
|
||||
"legend_overlay": return modals.legend_overlay
|
||||
"node_overlay": return modals.node_overlay
|
||||
"level_screen": return modals.level_screen
|
||||
"curio_overlay": return modals.curio_overlay
|
||||
"end_overlay": return modals.end_overlay
|
||||
"shop_overlay": return modals.shop_overlay
|
||||
"camp_screen": return screens.camp_screen
|
||||
"camp_overlay": return modals.camp_overlay
|
||||
"settings_overlay": return modals.settings_overlay
|
||||
"status_panel": return modals.status_panel
|
||||
"career_overlay": return modals.career_overlay
|
||||
"save_select_overlay": return modals.save_select_overlay
|
||||
"inter_overlay": return screens.inter_overlay
|
||||
"confirm_dialog": return modals.confirm_dialog
|
||||
"debug_overlay": return modals.debug_overlay
|
||||
"debug_badge": return screens.debug_badge
|
||||
return null
|
||||
|
||||
|
||||
# 合同装配(_build_ui 尾调用):按 LAYER_CONTRACT 序统一落位——直接子层 move_child 到合同槽、
|
||||
# 模态层按合同序登记;宿住层(host)树序随宿主只登记;成员层(shell)与屏壳同槽(屏壳占树位、成员占登记位)。
|
||||
# 本函数是全仓唯一层序落位点(move_child 单口)——改层序只改 LAYER_CONTRACT。
|
||||
func apply_layer_contract(root: Control) -> void:
|
||||
var slot := 0
|
||||
for entry: Dictionary in LAYER_CONTRACT:
|
||||
var tags: Array[Variant] = entry.get("tags", [])
|
||||
if entry.has("shell"):
|
||||
var shell: Node = node(String(entry["shell"]))
|
||||
var member: Node = node(String(entry["key"]))
|
||||
if shell != null:
|
||||
root.move_child(shell, slot)
|
||||
slot += 1
|
||||
if member != null:
|
||||
modals.register_layer(member as Control, tags)
|
||||
else:
|
||||
push_error("[合同装配] 层缺失: %s" % String(entry["key"]))
|
||||
continue
|
||||
var layer: Node = node(String(entry["key"]))
|
||||
if layer == null:
|
||||
push_error("[合同装配] 层缺失: %s" % String(entry["key"]))
|
||||
continue
|
||||
if entry.has("host"):
|
||||
modals.register_layer(layer as Control, tags)
|
||||
continue
|
||||
root.move_child(layer, slot)
|
||||
slot += 1
|
||||
if String(entry["kind"]) == "modal":
|
||||
modals.register_layer(layer as Control, tags)
|
||||
@@ -0,0 +1 @@
|
||||
uid://d1hahbtan1te8
|
||||
@@ -0,0 +1,16 @@
|
||||
## 屏壳与全屏容器域句柄册:三屏壳、屏内一级子层、全屏态、浮层角标、排播泵节点的注册面域容器。
|
||||
## 纯字段无方法;RefCounted 不挂树——节点本体树位与 add_child 归属由组合根与装配承接件负责。
|
||||
class_name UiScreens
|
||||
extends RefCounted
|
||||
|
||||
const RowPacer := preload("res://presentation/row_pacer.gd") # 排播泵取型(row_pacer.gd 非 class_name 全局)
|
||||
|
||||
var menu_screen: Control
|
||||
var camp_screen: Control
|
||||
var adventure_screen: Control
|
||||
var start_overlay: Control
|
||||
var battle_root: Control
|
||||
var inter_overlay: Control
|
||||
var inter_label: Label
|
||||
var debug_badge: Button
|
||||
var row_pacer: RowPacer
|
||||
@@ -0,0 +1 @@
|
||||
uid://dd8ep7nhmyrdq
|
||||
Reference in new issue
Block a user