diff --git a/_game/LevelDemonstration.tscn b/_game/LevelDemonstration.tscn index ede40d8..ec4c6e4 100644 --- a/_game/LevelDemonstration.tscn +++ b/_game/LevelDemonstration.tscn @@ -51,32 +51,32 @@ tile_map_data = PackedByteArray("AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAA auto_controlled_avatar = NodePath("../Avatar") [node name="Avatar" parent="." instance=ExtResource("3_6jw57")] -position = Vector2(218, 251) +position = Vector2(606, 108) collision_mask = 4 [node name="EventTriggerDoor" parent="." instance=ExtResource("4_p0ota")] position = Vector2(342, 176) -[node name="PropComponent" type="Node" parent="EventTriggerDoor"] +[node name="[Prop_0001]" type="Node" parent="EventTriggerDoor"] script = ExtResource("5_gslp7") prop_id = 1 metadata/_custom_type_script = "uid://b4menkyub4ce7" -[node name="States" type="Node" parent="EventTriggerDoor/PropComponent"] +[node name="States" type="Node" parent="EventTriggerDoor/[Prop_0001]"] -[node name="Close" type="Node" parent="EventTriggerDoor/PropComponent/States"] +[node name="Close" type="Node" parent="EventTriggerDoor/[Prop_0001]/States"] script = ExtResource("6_6jw57") state_id = 0 effects = Array[ExtResource("7_2t6pm")]([SubResource("Resource_2t6pm")]) metadata/_custom_type_script = "uid://7lml6d1t5xtq" -[node name="Open" type="Node" parent="EventTriggerDoor/PropComponent/States"] +[node name="Open" type="Node" parent="EventTriggerDoor/[Prop_0001]/States"] script = ExtResource("6_6jw57") state_id = 1 effects = Array[ExtResource("7_2t6pm")]([SubResource("Resource_g37lb")]) metadata/_custom_type_script = "uid://7lml6d1t5xtq" -[node name="FromClose" type="Node" parent="EventTriggerDoor/PropComponent/States/Open"] +[node name="FromClose" type="Node" parent="EventTriggerDoor/[Prop_0001]/States/Open"] script = ExtResource("8_xkd7q") from_state_id = 0 effects = Array[ExtResource("7_2t6pm")]([SubResource("Resource_xkd7q")]) @@ -87,15 +87,15 @@ script = ExtResource("9_ady2r") tween_resource = SubResource("Resource_xja44") metadata/_custom_type_script = "uid://bhexx6mj1xv3q" -[node name="PropComponent" type="Node" parent="PhantomCamera2D"] +[node name="[Prop_0000]" type="Node" parent="PhantomCamera2D"] script = ExtResource("5_gslp7") prop_id = 0 metadata/_custom_type_script = "uid://b4menkyub4ce7" -[node name="States" type="Node" parent="PhantomCamera2D/PropComponent"] +[node name="States" type="Node" parent="PhantomCamera2D/[Prop_0000]"] script = ExtResource("11_m16wo") -[node name="[ID_0] Default" type="Node" parent="PhantomCamera2D/PropComponent/States"] +[node name="[ID_0] Default" type="Node" parent="PhantomCamera2D/[Prop_0000]/States"] script = ExtResource("6_6jw57") state_id = 0 @@ -112,3 +112,45 @@ script = ExtResource("12_xja44") [node name="Props" type="Node2D" parent="ReedScene"] script = ExtResource("14_3ihdv") + +[node name="EventTriggerDoor" parent="ReedScene/Props" instance=ExtResource("4_p0ota")] +position = Vector2(832, 64) + +[node name="[Prop_0000]" type="Node" parent="ReedScene/Props/EventTriggerDoor"] +script = ExtResource("5_gslp7") +prop_id = 0 + +[node name="States" type="Node" parent="ReedScene/Props/EventTriggerDoor/[Prop_0000]"] +script = ExtResource("11_m16wo") + +[node name="[ID_0] Default" type="Node" parent="ReedScene/Props/EventTriggerDoor/[Prop_0000]/States"] +script = ExtResource("6_6jw57") +state_id = 0 + +[node name="EventTriggerDoor2" parent="ReedScene/Props" instance=ExtResource("4_p0ota")] +position = Vector2(723, 64) + +[node name="[Prop_0001]" type="Node" parent="ReedScene/Props/EventTriggerDoor2"] +script = ExtResource("5_gslp7") +prop_id = 1 + +[node name="States" type="Node" parent="ReedScene/Props/EventTriggerDoor2/[Prop_0001]"] +script = ExtResource("11_m16wo") + +[node name="[ID_0] Default" type="Node" parent="ReedScene/Props/EventTriggerDoor2/[Prop_0001]/States"] +script = ExtResource("6_6jw57") +state_id = 0 + +[node name="EventTriggerDoor3" parent="ReedScene/Props" instance=ExtResource("4_p0ota")] +position = Vector2(458, 63) + +[node name="[Prop_0002]" type="Node" parent="ReedScene/Props/EventTriggerDoor3"] +script = ExtResource("5_gslp7") +prop_id = 2 + +[node name="States" type="Node" parent="ReedScene/Props/EventTriggerDoor3/[Prop_0002]"] +script = ExtResource("11_m16wo") + +[node name="[ID_0] Default" type="Node" parent="ReedScene/Props/EventTriggerDoor3/[Prop_0002]/States"] +script = ExtResource("6_6jw57") +state_id = 0 diff --git a/addons/reedscene/act/ActManager.gd b/addons/reedscene/act/ActManager.gd index fd9b8ab..661753a 100644 --- a/addons/reedscene/act/ActManager.gd +++ b/addons/reedscene/act/ActManager.gd @@ -12,6 +12,8 @@ var _gen_default_act: Callable = Callable(self, "_editor_generate_default_act") ##是否要输出报错信息 @export var debug_log: bool = false +signal act_changed(from_act_id: int, to_act_id: int) + ##用来扫描prop func _scan_scene_for_props(scene_root: Node) -> Dictionary: var result := {} @@ -76,7 +78,7 @@ func _editor_generate_default_act() -> void: var pid := prop_comp.prop_id var init_state := prop_comp.initial_state_id - act.prop_state_map[pid] = init_state + act.prop_state_map[pid].state_id = init_state count += 1 prop_state_map[0] = act diff --git a/addons/reedscene/scene/ReedScene.gd b/addons/reedscene/scene/ReedScene.gd index 0a456d1..a2fcdb1 100644 --- a/addons/reedscene/scene/ReedScene.gd +++ b/addons/reedscene/scene/ReedScene.gd @@ -56,7 +56,6 @@ const SCENE_MANAGER_NAME := "SceneManager" ## ============================== ## Internal State ## ============================== - var _act_manager: ActManager var _props_root: Node var _prop_map: Dictionary = {} # prop_id -> PropComponent @@ -126,11 +125,10 @@ func _find_prop_component(prop: Node) -> PropComponent: func _bind_act_events() -> void: if _act_manager == null: return - _act_manager.act_changed.connect(_on_act_changed) -func _on_act_changed(from_act: StringName, to_act: StringName) -> void: +func _on_act_changed(from_act: int, to_act: int) -> void: if debug_log: print("[ReedScene] Act changed:", from_act, "->", to_act) @@ -153,7 +151,6 @@ func _editor_ensure_node(name: String, type: Variant) -> Node: node.name = name add_child(node) - # ⚠️ 关键:让节点成为 Scene 的一部分 node.owner = get_tree().edited_scene_root if debug_log: diff --git a/update.md b/update.md index 537fd1b..6fe9e25 100644 --- a/update.md +++ b/update.md @@ -32,6 +32,10 @@ v0.2.3 - 基础的关卡编辑器,主要明确了几个概念:Prop Scene,Act,目前已经有了一个基础的展示功能性质的Demo - 分离了Player和控制器,现在Player是Avatar,控制器是PlayerController,控制器向玩家发送指令,玩家接收指令以驱动功能。 +v0.2.4 + +- 鈎爪的基礎版本,包含了鈎爪類,鈎爪管理類,鈎爪錨點類等,鈎爪的移動方式是在LocoComp裏添加了一個額外的移動模式。 + ## 更新计划 V0.1 @@ -99,8 +103,18 @@ V0.3 - [ ] 可以通過signal播放不同的相機震動 - [ ] 可以播放一個隨機的SFX Asset - [ ] 不同的SFX預設 +- [ ] GlobalCameraManger + - [ ] 全局的相機管理器,可以用來切換相機在不同的幾個預設之間切換 + - [ ] 敘事性相機 + - [ ] 跟隨玩家的運動性相機 + V0.4 主要是拓展基于项目的特殊需求,包括: - [ ] 钩爪功能基本实现 + - [x] 飛向目標點 + - [x] 如果目標點移動,會持續跟隨 + - [ ] 細化手感參數 + - [ ] 在鈎爪飛到一半的時候可以取消鈎爪 + - [x] 鈎爪的長度可變