godot-plateformer/addons/reedscene/scene/SceneManager.gd

79 lines
1.6 KiB
GDScript3
Raw Normal View History

2025-12-29 11:54:31 +08:00
class_name SceneManager
extends Node
2026-01-07 18:09:57 +08:00
@export var quick_trigger: Array[SceneTrigger]
2026-01-02 18:37:09 +08:00
## ==============================
## References
## ==============================
var _scene: ReedScene
var _act_manager: ActManager
var _props: Dictionary # prop_id -> PropComponent
2025-12-29 11:54:31 +08:00
func _ready() -> void:
2026-01-02 18:37:09 +08:00
await get_parent().ready
2025-12-29 11:54:31 +08:00
2026-01-02 18:37:09 +08:00
_resolve_scene()
if _scene == null:
push_error("[SceneManager] Parent is not ReedScene.")
2025-12-29 11:54:31 +08:00
return
2026-01-02 18:37:09 +08:00
_resolve_references()
2026-01-07 18:09:57 +08:00
_bind_quick_trigger()
2025-12-29 11:54:31 +08:00
2026-01-02 18:37:09 +08:00
func _resolve_scene() -> void:
var p := get_parent()
if p is ReedScene:
_scene = p
2025-12-29 11:54:31 +08:00
else:
2026-01-02 18:37:09 +08:00
_scene = null
func _resolve_references() -> void:
_act_manager = _scene._act_manager
_props = _scene._prop_map
2026-01-07 18:09:57 +08:00
func _bind_quick_trigger() -> void:
for i in quick_trigger:
var st := i as SceneTrigger
if not st:
continue
var tr := st.trigger_register_conifg as SceneTriggerRegister
if not tr:
continue
var r := tr.get_register(self)
if not r:
continue
if not r.has_signal(tr.monitor_signal):
continue
r.connect(
tr.monitor_signal,
func(...args):
_on_trigger_fired(st, args)
)
2026-01-07 18:33:34 +08:00
## 当信号触发
2026-01-07 18:09:57 +08:00
func _on_trigger_fired(trigger: SceneTrigger, signal_args: Array) -> void:
if not trigger.can_trigger(signal_args):
return
for i in trigger.trigger_effect_pairs:
var sp := i as SceneTriggerEffectPair
if not sp.target:
continue
var t := sp.target.get_effect_target(self)
if not t:
continue
var exs := sp.effect
for j in exs:
var ex := j as SceneTriggerEffect
ex.apply_effect(t)
func switch_act_with_id(id: int,trans_overwrite:int = 0) -> void:
_act_manager.switch_act_with_id(id,trans_overwrite)