From eaa51620e1d92cbc62d23a8001572db9fc027159 Mon Sep 17 00:00:00 2001 From: cakipaul Date: Tue, 21 Jan 2025 18:08:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=81=93=E5=85=B7=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=A3=80=E8=A7=86=E7=95=8C=E9=9D=A2=E7=9A=84ux?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=88=E4=B8=8Eballoon=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E9=80=80=E5=87=BA=EF=BC=89=EF=BC=9Bground=20=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E4=B8=8B=20debug=20=E6=97=B6=E7=9B=B4=E6=8E=A5=E9=80=9A?= =?UTF-8?q?=E8=BF=87=20main=20=E5=9C=BA=E6=99=AF=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manager/archive_manager/archive_manager.gd | 3 +- manager/deploy/scene/scene_manager.gd | 35 +--------- scene/dialog/balloon.gd | 27 +++++--- scene/dialog/balloon_debug.tscn | 4 +- scene/entity/note.gd | 1 - scene/ground/camera/camera_focus_marker.gd | 2 +- scene/ground/ground.gd | 37 ++++++++-- scene/ground/ground.tscn | 1 + scene/ground/ground_loader.gd | 68 ++++++++----------- scene/ground/ground_loader.tscn | 1 + scene/ground/scene/c01/s05_院长房间.tscn | 25 ++++--- .../ground/scene/c01/s06_孤儿院长廊围墙.tscn | 20 +++--- scene/ground/scene/c02/s03_院子切换.tscn | 2 +- .../general/animated_sprite_state_machine.gd | 11 +++ .../general}/autoplay_animated_sprite.gd | 0 .../ground/script/general/state_action_res.gd | 6 ++ scene/player/main_player.gd | 2 +- scene/player/main_player.tscn | 1 + scene/prop/prop_hud.gd | 11 +-- scene/prop/prop_inspector.gd | 18 +++-- util/resource_utils.gd | 17 ----- 21 files changed, 146 insertions(+), 146 deletions(-) create mode 100644 scene/ground/script/general/animated_sprite_state_machine.gd rename scene/{tool => ground/script/general}/autoplay_animated_sprite.gd (100%) create mode 100644 scene/ground/script/general/state_action_res.gd delete mode 100644 util/resource_utils.gd diff --git a/manager/archive_manager/archive_manager.gd b/manager/archive_manager/archive_manager.gd index 61e8c6b9..78ed14c4 100644 --- a/manager/archive_manager/archive_manager.gd +++ b/manager/archive_manager/archive_manager.gd @@ -78,8 +78,9 @@ func check_autosave_options(): autosave_timer.start() if GlobalConfig.DEBUG: print( - "check_autosave_options:", + "check_autosave_option: ", GlobalConfigManager.config.auto_save_enabled, + " wait_time=", autosave_timer.wait_time ) diff --git a/manager/deploy/scene/scene_manager.gd b/manager/deploy/scene/scene_manager.gd index 699eee32..91282e03 100644 --- a/manager/deploy/scene/scene_manager.gd +++ b/manager/deploy/scene/scene_manager.gd @@ -28,11 +28,6 @@ func get_ground() -> Ground2D: var loader = get_ground_loader() if loader: return loader.ground - # 在 editor 编辑时,ground 在 Section 节点下 - var root = get_node("/root") - for child in root.get_children(): - if child.name.begins_with("S0") or child.name.begins_with("S1"): - return child.get_node_or_null("Ground") as Ground2D return null @@ -73,7 +68,7 @@ func focus_player() -> void: ground.focus_player() -func focus_player_and_reset_zoom(duration := .5) -> void: +func focus_player_and_reset_zoom(duration := 1) -> void: var marker = get_camera_marker() if marker: marker.tween_zoom(1.0, duration).tween_callback(focus_player) @@ -152,35 +147,9 @@ func pop_debug_dialog_info(character: String, content: String): #### Prop #### -var hud_path = "" - func get_prop_hud() -> PropHud: - var hud = get_node_or_null("/root/Main/UILayer/PropHUD") as PropHud - if hud: - return hud - if hud_path: - hud = get_node_or_null(hud_path) as PropHud - if hud: - return hud - else: - hud_path = "" - # 如果在 debug 模式从其他场景启动,没有 HUD 但又要获取,就新建 hud 放进场景 - var ground = get_ground() - if ground: - var parent = ground.get_parent() - if parent: - var layer = CanvasLayer.new() - layer.layer = GlobalConfig.CANVAS_LAYER_UI - layer.name = "UILayer" - hud = preload("res://scene/prop/prop_hud.tscn").instantiate() - hud.name = "PropHUD" - layer.add_child(hud) - hud.inventory = ArchiveManager.archive.prop_inventory - parent.call_deferred("add_child", layer) - hud_path = str(parent.get_path()) + "/UILayer/PropHUD" - print("New HUD path:", hud_path) - return hud + return get_node_or_null("/root/Main/UILayer/PropHUD") as PropHud func get_current_prop(must_selected: bool) -> String: diff --git a/scene/dialog/balloon.gd b/scene/dialog/balloon.gd index c0021ea1..b020f6e3 100755 --- a/scene/dialog/balloon.gd +++ b/scene/dialog/balloon.gd @@ -1,5 +1,7 @@ extends CanvasLayer +signal manually_skipped_line + @export var force_locale :String: set(val): force_locale = val @@ -46,10 +48,6 @@ var dialogue_line: DialogueLine: if not is_node_ready(): await ready dialogue_line = next_dialogue_line - # 如果是「音效: ...」,且不是 debug 模式,则直接跳过 - if dialogue_line.character == "音效" and not GlobalConfig.DEBUG: - next(dialogue_line.next_id) - return character_label.visible = not dialogue_line.character.is_empty() character_label.text = tr(dialogue_line.character, "dialogue") #主要角色颜色 @@ -127,6 +125,9 @@ var dialogue_line: DialogueLine: next(next_dialogue_line.next_id) # var time = next_dialogue_line.text.length() * 0.2 if next_dialogue_line.time == "auto" else next_dialogue_line.time.to_float() # await get_tree().create_timer(time).timeout + # 如果当前 line 运行结束,则 queue free 释放资源 + if dialogue_line == next_dialogue_line: + queue_free() func _ready() -> void: layer = GlobalConfig.CANVAS_LAYER_DIALOG @@ -162,10 +163,6 @@ func _setup_content_text() -> void: dialogue_line.text = text -func _unhandled_input(_event: InputEvent) -> void: - # Only the balloon is allowed to handle input while it's showing - get_viewport().set_input_as_handled() - func _notification(what: int) -> void: # Detect a change of locale and update the current dialogue line to show the new language if what == NOTIFICATION_TRANSLATION_CHANGED and is_instance_valid(dialogue_label): @@ -196,10 +193,16 @@ func _on_mutated(_mutation: Dictionary) -> void: balloon.hide() ) + +# func _unhandled_input(_event: InputEvent) -> void: +# # Only the balloon is allowed to handle input while it's showing +# get_viewport().set_input_as_handled() + + func _on_balloon_gui_input(event: InputEvent) -> void: # See if we need to skip typing of the dialogue if dialogue_label.is_typing: - if event.is_action_pressed("interact"): + if event.is_action_pressed("interact") or event.is_action_pressed("cancel"): dialogue_label.skip_typing() get_viewport().set_input_as_handled() return @@ -208,15 +211,17 @@ func _on_balloon_gui_input(event: InputEvent) -> void: if dialogue_line.responses.size() > 0: return # When there are no response options the balloon itself is the clickable thing - get_viewport().set_input_as_handled() + # get_viewport().set_input_as_handled() #if event is InputEventMouseButton and event.is_pressed() and event.button_index == MOUSE_BUTTON_LEFT: #next(dialogue_line.next_id) #elif event.is_action_pressed(next_action) and get_viewport().gui_get_focus_owner() == balloon: #next(dialogue_line.next_id) - if event.is_action_pressed("interact"): + if event.is_action_pressed("interact") or event.is_action_pressed("cancel"): # if event.is_action_pressed("interact") and get_viewport().gui_get_focus_owner() == balloon: + get_viewport().set_input_as_handled() + manually_skipped_line.emit() next(dialogue_line.next_id) func _on_responses_menu_response_selected(response: DialogueResponse) -> void: diff --git a/scene/dialog/balloon_debug.tscn b/scene/dialog/balloon_debug.tscn index b812cc30..2408a8d2 100644 --- a/scene/dialog/balloon_debug.tscn +++ b/scene/dialog/balloon_debug.tscn @@ -127,6 +127,7 @@ clip_contents = false layout_mode = 2 size_flags_horizontal = 4 size_flags_vertical = 0 +mouse_filter = 2 theme_override_colors/font_shadow_color = Color(0.306923, 0.306923, 0.306923, 0.388235) theme_override_constants/shadow_offset_y = 1 theme_override_constants/shadow_offset_x = 1 @@ -154,13 +155,14 @@ mouse_filter = 2 unique_name_in_owner = true layout_mode = 2 size_flags_vertical = 8 +mouse_filter = 2 theme_override_constants/separation = 2 script = ExtResource("4_4netn") response_template = NodePath("ResponseExample") [node name="ResponseExample" type="Button" parent="Balloon/Responses/ResponsesMenu"] layout_mode = 2 -mouse_filter = 1 +mouse_filter = 2 text = "Response example" [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] diff --git a/scene/entity/note.gd b/scene/entity/note.gd index 2a3a8dfa..ba3dfa1e 100644 --- a/scene/entity/note.gd +++ b/scene/entity/note.gd @@ -89,7 +89,6 @@ func _show_os(res, title): func _show_balloon(res, title): # SceneManager.focus_node(self) - # SceneManager.get_camera_marker().tween_zoom(1.1, 1.5) DialogueManager.show_dialogue_balloon(res, title) # TODO note viewing animation SceneManager.freeze_player(0) diff --git a/scene/ground/camera/camera_focus_marker.gd b/scene/ground/camera/camera_focus_marker.gd index b3c2f4ec..8a36f0c4 100644 --- a/scene/ground/camera/camera_focus_marker.gd +++ b/scene/ground/camera/camera_focus_marker.gd @@ -18,10 +18,10 @@ class_name CameraFocusMarker extends Marker2D # @export var limit_bottom := 158.0 @export var limit_top := 0 @export var limit_bottom := 316.0 +@export var zoom_ratio := 1.0 @onready var target = %Target as Node2D -var zoom_ratio := 1.0 var zoom_tween: Tween diff --git a/scene/ground/ground.gd b/scene/ground/ground.gd index 90af3e36..dcb8c206 100644 --- a/scene/ground/ground.gd +++ b/scene/ground/ground.gd @@ -2,6 +2,8 @@ class_name Ground2D extends Node2D @export var scene_name := "" +# 用于在 debug 时态下,指定进入的 portal +@export_enum("left", "right", "1", "2", "3", "4", "5", "6", "7", "8", "9") var default_portal := "left" @export_group("Player", "player_") @export var player_y_fixed := true @export var player_y := 70: @@ -44,23 +46,38 @@ const FOOTSTEP_AUDIO = { func _ready() -> void: - foreground.layer = GlobalConfig.CANVAS_LAYER_FG - _reset_player_positon() + # 仅在编辑器中调试时,通过 main 场景启动 + if GlobalConfig.DEBUG and (not Engine.is_editor_hint()) and (not get_parent() is GroundLoader): + call_deferred("_restart_from_main") + return # 检查 scene_name 是否合法 scene_name = scene_name.strip_edges() if not scene_name or scene_name.length() != 7: printerr("scene_name is not valid") return + _reset_player_positon() if Engine.is_editor_hint(): return - # 如果 debug 模式下不通过 GroundLoader 启动,读取 palyer 位置 - if GlobalConfig.DEBUG and not get_parent() is GroundLoader: - player.global_position.x = ArchiveManager.archive.player_global_position_x + foreground.layer = GlobalConfig.CANVAS_LAYER_FG _set_camera_and_player_boundary() _load_footstep_audio() focus_player() # %ColorRectTop.visible = true # %ColorRectBottom.visible = true + # 如果 debug 模式下不通过 GroundLoader 启动,则插入到 main 以下 + + +func _restart_from_main(): + var main = load("res://scene/main.tscn").instantiate() + # if not main.is_node_ready(): + # await main.ready + var ground_loader = main.get_node("./GroundLoader") as GroundLoader + ground_loader.ignore_archive = false + ground_loader.archive_scene = scene_name + ground_loader.archive_portal = default_portal + # ground_loader.transition_to_scene(scene_name, default_portal, true) + get_node("/root").add_child(main) + get_parent().queue_free() func _enter_tree() -> void: @@ -126,3 +143,13 @@ func focus_node(node: CanvasItem) -> void: func focus_player() -> void: focus_node(player) + + +func move_player_to_portal(portal_name := default_portal) -> void: + var portal_node = get_node_or_null("DeployLayer/portal_" + portal_name) as Node2D + if portal_node: + player.global_position.x = portal_node.global_position.x + if GlobalConfig.DEBUG: + print("move player to portal:", portal_name, portal_node.global_position) + else: + printerr(scene_name + " portal not found: " + portal_name) diff --git a/scene/ground/ground.tscn b/scene/ground/ground.tscn index 22178797..75c91659 100644 --- a/scene/ground/ground.tscn +++ b/scene/ground/ground.tscn @@ -16,6 +16,7 @@ func _ready() -> void: [node name="Ground" type="Node2D"] script = ExtResource("1_0vrlo") +default_portal = "left" [node name="AnimationPlayer" type="AnimationPlayer" parent="."] diff --git a/scene/ground/ground_loader.gd b/scene/ground/ground_loader.gd index ea2e29ea..e16b50d5 100644 --- a/scene/ground/ground_loader.gd +++ b/scene/ground/ground_loader.gd @@ -10,6 +10,7 @@ class_name GroundLoader extends Node2D debug_reload = false if is_node_ready() and current_scene and entrance_portal: transition_to_scene(current_scene, entrance_portal, true) +# 强制覆盖 archive 记录 @export var archive_scene := "" @export var archive_portal := "" @@ -32,7 +33,9 @@ func _ready() -> void: mask.color.a = 0.0 # grounds _read_grounds() - # ground = get_node_or_null("Ground") + ground = get_node_or_null("Ground") as Ground2D + if ground: + ground.queue_free() # load save if not ignore_archive: _load_save() @@ -62,14 +65,14 @@ func _load_save(): archive_scene = ArchiveManager.archive.current_scene if ArchiveManager.archive.entrance_portal: archive_portal = ArchiveManager.archive.entrance_portal - # 使用 archive 所记录的场景 - if archive_scene and archive_portal: + # 强制覆盖 archive 记录 + if archive_scene or archive_portal: current_scene = archive_scene entrance_portal = archive_portal func _toggle_mask(display: bool, _immediately: bool) -> Tween: - var tween = get_tree().create_tween() + var tween = create_tween() if display: tween.tween_property(mask, "color:a", 1.0, 0.3).set_trans(Tween.TRANS_CUBIC) display_mask_time = Time.get_ticks_msec() @@ -90,7 +93,8 @@ func transition_to_scene(scene_name: String, portal: String, immediately: bool) current_scene = scene_name entrance_portal = portal # 优先更新 archive,使 ground 可以访问自己的 current_scene 键值 - _update_archive() + if not Engine.is_editor_hint(): + _update_archive() # 转场效果,在 _load_ground_node 之前播放 var tween = _toggle_mask(true, immediately) tween.tween_callback(_do_transition.bind(scene_name)) @@ -99,28 +103,20 @@ func transition_to_scene(scene_name: String, portal: String, immediately: bool) print("Scene not found: " + scene_name) -func _update_player_position(): - if ignore_archive or Engine.is_editor_hint(): - return - var player = SceneManager.get_player() as MainPlayer - if player and ArchiveManager.archive: - # if GlobalConfig.DEBUG: - # print("update player position", ArchiveManager.archive.player_global_position) - if ArchiveManager.archive.player_global_position_x >= 0: - player.global_position.x = ArchiveManager.archive.player_global_position_x - player.set_facing_direction(ArchiveManager.archive.player_direction) +func _update_archive(): + ArchiveManager.archive.current_scene = current_scene + ArchiveManager.archive.entrance_portal = entrance_portal + archive_scene = current_scene + archive_portal = entrance_portal func _do_transition(scene_name: String): # SceneManager.freeze_player(0) - var ground_node = _load_ground_node(scene_name) - if ground == ground_node: - return if ground: # 提前移除,防止命名冲突 remove_child(ground) - # 不需要释放,因为会缓存,在 ground_node_cache 中释放 - # ground.queue_free() + ground.queue_free() + var ground_node = _load_ground_node(scene_name) # 先设置 ground,再添加到场景中 # 因为 ground 在 enter_tree 时会用到 SceneManager 的方法 # 其中间接用到了 GroundLoader 的 ground @@ -135,30 +131,26 @@ func _do_transition(scene_name: String): func _add_ground(): ground.name = "Ground" add_child(ground) - if not Engine.is_editor_hint(): - var portal_node = ground.get_node_or_null("DeployLayer/portal_" + entrance_portal) as Node2D - if portal_node: - var player = SceneManager.get_player() - if player: - # player.global_position.x = -20.0 - player.global_position.x = portal_node.global_position.x - if GlobalConfig.DEBUG: - print("move player to portal:", entrance_portal, portal_node.global_position) - else: - printerr(current_scene + " portal not found: " + entrance_portal) # 更新玩家位置 if first_entered and not Engine.is_editor_hint(): - _update_player_position() + _update_player_position_from_archive() + elif not Engine.is_editor_hint(): + # move player to portal + ground.move_player_to_portal(entrance_portal) first_entered = false # SceneManager.release_player() -func _update_archive(): - if not Engine.is_editor_hint() and ArchiveManager.archive: - ArchiveManager.archive.current_scene = current_scene - ArchiveManager.archive.entrance_portal = entrance_portal - archive_scene = current_scene - archive_portal = entrance_portal +func _update_player_position_from_archive(): + if ignore_archive or Engine.is_editor_hint(): + return + var player = SceneManager.get_player() as MainPlayer + if player and ArchiveManager.archive: + # if GlobalConfig.DEBUG: + # print("update player position", ArchiveManager.archive.player_global_position) + if ArchiveManager.archive.player_global_position_x >= 0: + player.global_position.x = ArchiveManager.archive.player_global_position_x + player.set_facing_direction(ArchiveManager.archive.player_direction) func _load_ground_node(scene_name: String) -> Node2D: diff --git a/scene/ground/ground_loader.tscn b/scene/ground/ground_loader.tscn index 0abb65ed..03a3c33d 100644 --- a/scene/ground/ground_loader.tscn +++ b/scene/ground/ground_loader.tscn @@ -7,6 +7,7 @@ script = ExtResource("1_6mjre") [node name="MaskLayer" type="CanvasLayer" parent="."] unique_name_in_owner = true +layer = 11 [node name="Mask" type="ColorRect" parent="MaskLayer"] unique_name_in_owner = true diff --git a/scene/ground/scene/c01/s05_院长房间.tscn b/scene/ground/scene/c01/s05_院长房间.tscn index 3497d297..2cf9d385 100644 --- a/scene/ground/scene/c01/s05_院长房间.tscn +++ b/scene/ground/scene/c01/s05_院长房间.tscn @@ -197,38 +197,38 @@ tracks/13/keys = { tracks/14/type = "value" tracks/14/imported = false tracks/14/enabled = true -tracks/14/path = NodePath("Camera2D:zoom") +tracks/14/path = NodePath("DeployLayer/oneshot纸片/Sign:display_sign") tracks/14/interp = 1 tracks/14/loop_wrap = true tracks/14/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(1, 1)] +"update": 1, +"values": [true] } tracks/15/type = "value" tracks/15/imported = false tracks/15/enabled = true -tracks/15/path = NodePath("DeployLayer/oneshot纸片/Sign:display_sign") +tracks/15/path = NodePath("DeployLayer/oneshot纸片/Sign:position") tracks/15/interp = 1 tracks/15/loop_wrap = true tracks/15/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 1, -"values": [true] +"update": 0, +"values": [Vector2(3, -4)] } tracks/16/type = "value" tracks/16/imported = false tracks/16/enabled = true -tracks/16/path = NodePath("DeployLayer/oneshot纸片/Sign:position") +tracks/16/path = NodePath("MainPlayer/CameraFocusMarker:zoom_ratio") tracks/16/interp = 1 tracks/16/loop_wrap = true tracks/16/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 0, -"values": [Vector2(3, -4)] +"values": [1.0] } [sub_resource type="Animation" id="Animation_7k2c8"] @@ -462,7 +462,7 @@ tracks/8/path = NodePath("MainPlayer/CameraFocusMarker:position") tracks/8/interp = 1 tracks/8/loop_wrap = true tracks/8/keys = { -"times": PackedFloat32Array(0, 0.46, 3.98, 4.38), +"times": PackedFloat32Array(0, 0.5, 3.98, 4.38), "transitions": PackedFloat32Array(1, 1, 1, 1), "update": 0, "values": [Vector2(0, 0), Vector2(0, 10), Vector2(0, 10), Vector2(0, 0)] @@ -470,14 +470,14 @@ tracks/8/keys = { tracks/9/type = "value" tracks/9/imported = false tracks/9/enabled = true -tracks/9/path = NodePath("Camera2D:zoom") +tracks/9/path = NodePath("MainPlayer/CameraFocusMarker:zoom_ratio") tracks/9/interp = 1 tracks/9/loop_wrap = true tracks/9/keys = { -"times": PackedFloat32Array(0.3, 0.7, 3.92, 4.38), +"times": PackedFloat32Array(0.02, 0.54, 3.96, 4.38), "transitions": PackedFloat32Array(1, 1, 1, 1), "update": 0, -"values": [Vector2(1, 1), Vector2(1.5, 1.5), Vector2(1.5, 1.5), Vector2(1, 1)] +"values": [1.0, 1.5, 1.5, 1.0] } [sub_resource type="Animation" id="Animation_ocf0o"] @@ -712,7 +712,6 @@ height = 50.0 [node name="MainPlayer" parent="Ground" index="5"] character = "小小蝶" -running_locked = true [node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"] position = Vector2(21, 39) diff --git a/scene/ground/scene/c01/s06_孤儿院长廊围墙.tscn b/scene/ground/scene/c01/s06_孤儿院长廊围墙.tscn index 552e6df6..4bb0b802 100644 --- a/scene/ground/scene/c01/s06_孤儿院长廊围墙.tscn +++ b/scene/ground/scene/c01/s06_孤儿院长廊围墙.tscn @@ -8,7 +8,7 @@ [ext_resource type="Texture2D" uid="uid://c40gmvqw3vd88" path="res://asset/art/scene/c01/s06_孤儿院长廊围墙/l_长廊光.png" id="4_6ffae"] [ext_resource type="SpriteFrames" uid="uid://cemn2bnebsfko" path="res://asset/art/scene/c01/s06_孤儿院长廊围墙/全局参考.gif" id="4_8hecq"] [ext_resource type="Texture2D" uid="uid://bllt2wycchkp2" path="res://asset/art/scene/c01/s06_孤儿院长廊围墙/e_红柱子.png" id="4_dtycx"] -[ext_resource type="Script" path="res://scene/tool/autoplay_animated_sprite.gd" id="5_ailfs"] +[ext_resource type="Script" path="res://scene/ground/script/general/autoplay_animated_sprite.gd" id="6_4o4lo"] [node name="S06" type="Node2D"] metadata/_edit_horizontal_guides_ = [158.0, 88.0] @@ -43,19 +43,19 @@ immediately = false position = Vector2(547.5, 0.5) sprite_frames = ExtResource("2_l4axy") animation = &"男孩跑动-右" -script = ExtResource("5_ailfs") +script = ExtResource("6_4o4lo") [node name="跷跷板" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="3"] position = Vector2(1358.5, -0.5) sprite_frames = ExtResource("2_l4axy") animation = &"跷跷板" -script = ExtResource("5_ailfs") +script = ExtResource("6_4o4lo") [node name="秋千" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="4"] position = Vector2(1241.5, -0.5) sprite_frames = ExtResource("2_l4axy") animation = &"秋千" -script = ExtResource("5_ailfs") +script = ExtResource("6_4o4lo") [node name="PointLight2D" type="PointLight2D" parent="Ground/AmbientLayer" index="0"] energy = 0.6 @@ -77,37 +77,37 @@ offset = Vector2(0, -153) position = Vector2(377.5, -1.5) sprite_frames = ExtResource("2_l4axy") animation = &"中蓝衣小孩呼吸" -script = ExtResource("5_ailfs") +script = ExtResource("6_4o4lo") [node name="群众2" type="AnimatedSprite2D" parent="Ground/ParallaxForeground/BGParallaxLayer" index="2"] position = Vector2(408.5, 0.5) sprite_frames = ExtResource("2_l4axy") animation = &"右绿衣男孩呼吸" -script = ExtResource("5_ailfs") +script = ExtResource("6_4o4lo") [node name="群众3" type="AnimatedSprite2D" parent="Ground/ParallaxForeground/BGParallaxLayer" index="3"] position = Vector2(269.5, -1.5) sprite_frames = ExtResource("2_l4axy") animation = &"左2黄衣男呼吸" -script = ExtResource("5_ailfs") +script = ExtResource("6_4o4lo") [node name="群众4" type="AnimatedSprite2D" parent="Ground/ParallaxForeground/BGParallaxLayer" index="4"] position = Vector2(426.5, -0.5) sprite_frames = ExtResource("2_l4axy") animation = &"左一绿衣男呼吸" -script = ExtResource("5_ailfs") +script = ExtResource("6_4o4lo") [node name="红衣姑娘" type="AnimatedSprite2D" parent="Ground/ParallaxForeground/BGParallaxLayer" index="5"] position = Vector2(333.5, -1.5) sprite_frames = ExtResource("2_l4axy") animation = &"红衣姑娘呼吸" -script = ExtResource("5_ailfs") +script = ExtResource("6_4o4lo") [node name="院长" type="AnimatedSprite2D" parent="Ground/ParallaxForeground/BGParallaxLayer" index="6"] position = Vector2(301.5, -1.5) sprite_frames = ExtResource("2_l4axy") animation = &"院长呼吸" -script = ExtResource("5_ailfs") +script = ExtResource("6_4o4lo") [node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"] texture = null diff --git a/scene/ground/scene/c02/s03_院子切换.tscn b/scene/ground/scene/c02/s03_院子切换.tscn index 6a0332f7..504f8465 100644 --- a/scene/ground/scene/c02/s03_院子切换.tscn +++ b/scene/ground/scene/c02/s03_院子切换.tscn @@ -42,7 +42,7 @@ position = Vector2(629, 2) [node name="Npc" parent="Ground/DeployLayer" index="2" instance=ExtResource("2_r5smg")] position = Vector2(465, 23) -frame_progress = 0.514003 +frame_progress = 0.649558 character_name = "张胖子" dialogue_title = "张胖子_01" diff --git a/scene/ground/script/general/animated_sprite_state_machine.gd b/scene/ground/script/general/animated_sprite_state_machine.gd new file mode 100644 index 00000000..2f317f6f --- /dev/null +++ b/scene/ground/script/general/animated_sprite_state_machine.gd @@ -0,0 +1,11 @@ +extends AnimatedSprite2D + +var animation_state_dict = { +} + +func _ready() -> void: + if animation: + play(animation) + + + diff --git a/scene/tool/autoplay_animated_sprite.gd b/scene/ground/script/general/autoplay_animated_sprite.gd similarity index 100% rename from scene/tool/autoplay_animated_sprite.gd rename to scene/ground/script/general/autoplay_animated_sprite.gd diff --git a/scene/ground/script/general/state_action_res.gd b/scene/ground/script/general/state_action_res.gd new file mode 100644 index 00000000..66d312d9 --- /dev/null +++ b/scene/ground/script/general/state_action_res.gd @@ -0,0 +1,6 @@ +class_name StateActionConfigResource extends Resource + +@export var action_name := "" +@export var animation_begin := "" +@export var animation_mid := "" +@export var animation_end := "" diff --git a/scene/player/main_player.gd b/scene/player/main_player.gd index 325b7217..e76598f2 100644 --- a/scene/player/main_player.gd +++ b/scene/player/main_player.gd @@ -66,7 +66,7 @@ func _ready() -> void: func _enter_tree() -> void: - if is_node_ready(): + if is_node_ready() and not Engine.is_editor_hint(): _check_character_status() diff --git a/scene/player/main_player.tscn b/scene/player/main_player.tscn index e046b5d7..c9a2dc4d 100644 --- a/scene/player/main_player.tscn +++ b/scene/player/main_player.tscn @@ -27,6 +27,7 @@ modulate_color = Color(0.996078, 0.92549, 0.85098, 0.733333) [node name="MainPlayer" type="CharacterBody2D"] collision_mask = 2 script = ExtResource("1_3a78y") +running_locked = true metadata/_edit_vertical_guides_ = [-120.0] metadata/_edit_horizontal_guides_ = [-9.0] diff --git a/scene/prop/prop_hud.gd b/scene/prop/prop_hud.gd index 19ea397d..8c1c2373 100644 --- a/scene/prop/prop_hud.gd +++ b/scene/prop/prop_hud.gd @@ -295,18 +295,13 @@ func enable_prop_item(prop_key: String) -> void: var inspector = SceneManager.get_inspector() if inspector: var inspect_path = items_dict[prop_key].inspect_path + var prop_title = tr(prop_key) if inspect_path: var texture = load(inspect_path) as Texture2D - inspector.pop_prop_inspection(texture) + inspector.pop_prop_inspection(prop_title, texture) else: var texture = cached_inventory_textures[prop_key] - inspector.pop_prop_inspection(texture, true) - var prop_title = tr(prop_key) - var obtain_str = tr("ui_获得") - var text = "~ " + prop_key + "\n" + obtain_str + ": " + prop_title - text += "[#item][ID:" + prop_title + "]\n=> END" - var prop_res = DialogueManager.create_resource_from_text(text) - DialogueManager.show_dialogue_balloon(prop_res, prop_key) + inspector.pop_prop_inspection(prop_title, texture, true) func disable_prop_item(prop_key: String) -> void: diff --git a/scene/prop/prop_inspector.gd b/scene/prop/prop_inspector.gd index 4eea90bd..9d8dd047 100644 --- a/scene/prop/prop_inspector.gd +++ b/scene/prop/prop_inspector.gd @@ -4,7 +4,7 @@ class_name PropInspector extends CanvasLayer enum { STATUS_HIDDEN, STATUS_INSPECTING_PROP, STATUS_INSPECTING_COVER, STATUS_INSPECTING_NOTES } # must be connected to -signal quit +signal quit_and_hidden @onready var prop_bg = %PropBG as TextureRect @onready var origin_texture = %OriginPropTexture as TextureRect @@ -12,7 +12,6 @@ signal quit @onready var content_label = %ContentLabel as Label @onready var tip_label = %TipLabel as Label - var tip_cover = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_阅读") var tip_notes = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_收起") var texture_cover: Texture2D @@ -57,6 +56,7 @@ func _post_hide(): content_label.text = "" tip_label.text = tip_cover visible = false + quit_and_hidden.emit() func _blink_label(init := true): @@ -87,7 +87,7 @@ func pop_standard_inspection(cover_texture, notes_texture, inspection_note): _blink_label() -func pop_prop_inspection(cover_texture: Texture2D, use_default_bg := false): +func pop_prop_inspection(prop_title: String, cover_texture: Texture2D, use_default_bg := false): if status != STATUS_HIDDEN: _hide() if not cover_texture: @@ -108,6 +108,16 @@ func pop_prop_inspection(cover_texture: Texture2D, use_default_bg := false): tween.tween_property(full_texture, "modulate:a", 1.0, 0.15) content_label.text = "" tip_label.text = "" + + # 显示道具获得提示 + var obtain_str = tr("ui_获得") + var text = "~ title\n" + obtain_str + ": " + prop_title + text += "[#item][ID:" + prop_title + "]\n=> END" + var prop_res = DialogueManager.create_resource_from_text(text) + var balloon = preload("res://scene/dialog/balloon.tscn").instantiate() + # 手动跳过的同时隐藏 + balloon.manually_skipped_line.connect(_hide) + DialogueManager.show_dialogue_balloon_scene(balloon, prop_res, "title") SceneManager.freeze_player(0) @@ -117,7 +127,6 @@ func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("cancel"): get_viewport().set_input_as_handled() _hide() - quit.emit() if event.is_action_pressed("interact"): get_viewport().set_input_as_handled() # STATUS_INSPECTING_COVER 与 STATUS_INSPECTING_NOTES 之间互相切换 @@ -140,4 +149,3 @@ func _unhandled_input(event: InputEvent) -> void: # STATUS_INSPECTING_PROP 直接退出 elif status == STATUS_INSPECTING_PROP: _hide() - quit.emit() diff --git a/util/resource_utils.gd b/util/resource_utils.gd deleted file mode 100644 index 3156d171..00000000 --- a/util/resource_utils.gd +++ /dev/null @@ -1,17 +0,0 @@ -extends Object -class_name ResourceUtils - -# # remove editor's cache -# func remove_editor_cache(resource: Resource) -> void: -# if Engine.is_editor_hint(): -# (resource) - - -static func remove_editor_cache(name: String) -> void: - pass - # var dir = DirAccess.open("res://.godot/editor") - # for file in dir.get_files(): - # if file.get_basename().begins_with(name): - # DirAccess.remove_absolute("res://.godot/editor/" + file) - # print("Removed editor cache: ", file) - # break