Scene管理器V0.3

This commit is contained in:
Reed 2026-01-01 13:03:35 +08:00
parent 1199bc736a
commit 93aa31c38e
9 changed files with 288 additions and 85 deletions

21
_game/DemoScript.gd Normal file
View File

@ -0,0 +1,21 @@
extends Node2D
@onready var act_manager: ActManager = $ReedScene/ActManager
var s := 1
func _unhandled_input(event: InputEvent) -> void:
if act_manager == null:
return
if event.is_action_pressed("ui_right"):
s = clampi(s+1,0,2)
act_manager.switch_act_with_id(s)
elif event.is_action_pressed("ui_left"):
s = clampi(s-1,0,2)
act_manager.switch_act_with_id(s)
elif event.is_action_pressed("ui_up"):
act_manager.switch_act_with_id(3)
elif event.is_action_pressed("ui_down"):
act_manager.switch_act_with_id(4)

1
_game/DemoScript.gd.uid Normal file
View File

@ -0,0 +1 @@
uid://ds6jy3s0hhmwt

File diff suppressed because one or more lines are too long

View File

@ -12,10 +12,6 @@ var door_state_id: int = 0
##门移动动画结束广播输出0为关闭输出1为开启
signal door_move_finished(int)
func _ready() -> void:
await get_tree().create_timer(.2).timeout
$PropComponent.change_state(1,true)
##开门
func door_open() -> void:
door_move(door_open_poser)

View File

@ -18,8 +18,49 @@ var _gen_empty_act: Callable = Callable(self, "_editor_generate_empty_act")
var max_index := max(prop_state_map.size() - 1, 0)
init_act_id = clamp(value, 0, max_index)
## ====================
## Private Field
## ====================
var _current_act: Act = null
var _current_act_id: int = -1
signal act_changed(from_act_id: int, to_act_id: int)
func _ready() -> void:
##初始默认把act 切换到Default状态
switch_act_with_id(0)
##通过ID切换act
func switch_act_with_id(act_id: int) -> void:
if not prop_state_map.has(act_id):
push_warning("[ActManager] Act id not found: %d" % act_id)
return
var act := prop_state_map[act_id]
_switch_act_internal(act, act_id)
##内部通过ID和Act来切换状态
func _switch_act_internal(act: Act, act_id: int) -> void:
if act == null:
return
var from_id := _current_act_id
_current_act = act
_current_act_id = act_id
for pid in act.prop_state_map.keys():
var single := act.prop_state_map[pid]
if single == null:
continue
var prop := _find_prop_by_id(pid)
if prop == null:
continue
prop.change_state(single.state_id, single.use_trans)
emit_signal("act_changed", from_id, act_id)
##用来扫描prop
func _scan_scene_for_props(scene_root: Node) -> Dictionary:
var result := {}
@ -158,3 +199,27 @@ func _find_next_free_act_id() -> int:
while prop_state_map.has(id):
id += 1
return id
##通过ID寻找Prop
func _find_prop_by_id(prop_id: int) -> PropComponent:
var scene := _get_owner_scene()
if scene == null:
return null
var props_root := scene.get_node_or_null(scene.props_root_path)
if props_root == null:
return null
return _find_prop_recursive(props_root, prop_id)
##递归的寻找Prop
func _find_prop_recursive(node: Node, prop_id: int) -> PropComponent:
if node is PropComponent and node.prop_id == prop_id:
return node as PropComponent
for child in node.get_children():
var r := _find_prop_recursive(child, prop_id)
if r != null:
return r
return null

View File

@ -2,3 +2,4 @@ class_name SingleAct extends Resource
@export var state_id: int = 0
@export var use_trans: bool = false
@export var context: Dictionary

View File

@ -132,9 +132,6 @@ func _on_act_changed(from_act: int, to_act: int) -> void:
if debug_log:
print("[ReedScene] Act changed:", from_act, "->", to_act)
for prop_comp in _prop_map.values():
prop_comp.on_act_changed(from_act, to_act)
##进入场景树自动添加ActManager,PropsRoot,和SceneManager
func _editor_ensure_scene_nodes() -> void:
_editor_ensure_node(SCENE_MANAGER_NAME, SceneManager)

View File

@ -6,10 +6,35 @@ V0.1
- 添加了基础的ActPropScene的概念。
V0.2
- 实现了通过切换PropState来切换Prop的功能
V0.3
- 实现了通过切换ActID来切换Act的功能
## 更新计划
V0.1
主要的工作是搭建一个插件的基本架构
- [x] 角色墙滑
V0.2
完善PropState的功能
V0.3
完善Act的功能
- Act管理器负责切换Act广播通知当前Scene下属的Prop进行状态切换。
- Act的快捷创建各种不同的Act。
V0.4
完善Scene的功能
- Scene具有全局唯一的ID
- SceneManager可以切换Act也可以切换PropState也可以通过ID获取到Prop
-

View File

@ -105,8 +105,8 @@ V0.3
- [ ] 不同的SFX預設
- [ ] GlobalCameraManger
- [ ] 全局的相機管理器,可以用來切換相機在不同的幾個預設之間切換
- [ ] 敘事性相機
- [ ] 跟隨玩家的運動性相機
- [ ] 敘事性相機
- [ ] 跟隨玩家的運動性相機
V0.4