@tool extends AnimationRoot # 覆盖该方法 func _default_data() -> Dictionary: return {"has_entered": false} func _ready() -> void: super._ready() if Engine.is_editor_hint(): return #region node_reference var collapse_sprite: AnimatedSprite2D var ambush_collapse: Ambush2D var final_meat_ambush: Ambush2D var final_meat_sprite: AnimatedSprite2D var final_label #endregion # 读取设置变量名 func _setup_node_reference() -> void: collapse_sprite = $"../ParallaxBackground2/山前地后/小孩山塌了" final_meat_ambush = $"../DeployLayer/Ambush最终吃肉" final_meat_sprite = $"../DeployLayer/Ambush最终吃肉/Pro吃肉" final_label = $"../CanvasLayer/最终吃肉" ambush_collapse = $"../DeployLayer/Ambush小孩山塌了" func _on_ground_ready() -> void: # 设置相机范围 var player = SceneManager.get_player() var right_x = player.player_movement_rect.size.x var rect := Rect2i(0, -158, int(right_x) + 320, 316) SceneManager.get_camera_marker().apply_limits(rect) # 玩家不能超过 ambush_collapse 位置 player.global_position.x = min(player.global_position.x, ambush_collapse.global_position.x) # 处理 Ambush肉1 节点 for i in range(1, 4): var node = get_node("../DeployLayer/Ambush肉" + str(i)) as Ambush2D if node.played: node.hide() _disable_wall_on_meat(node) else: node.triggered.connect(_on_eat_meat_triggered.bind(node)) if not data["has_entered"]: var x = $"../DeployLayer/portal_left".global_position.x SceneManager.get_player().global_position.x = x SceneManager.get_player().set_facing_direction(Vector2.RIGHT) SceneManager.lock_player(0, 9, true) set_data("has_entered", true) await SceneManager.pause_and_hide_player_sprite(1.0) await SceneManager.get_player().animation_finished SceneManager.unlock_player() func _disable_wall_on_meat(meat_node) -> void: meat_node.get_node("StaticBody2D/CollisionShape2D").disabled = true func _on_eat_meat_triggered(node) -> void: _disable_wall_on_meat(node) _tween_display_label(node) var player = SceneManager.get_player() SceneManager.lock_player(0, 8) var tween = create_tween() tween.tween_interval(0.9) tween.tween_property(node, "self_modulate:a", 0.0, 1.0) await player.animation_finished SceneManager.unlock_player() func _tween_display_label(node) -> void: var label = node.get_node("Label") label.modulate.a = 0.0 label.show() var tween = create_tween() tween.tween_property(label, "modulate:a", 1.0, 0.5) tween.tween_interval(5.0) tween.tween_property(label, "modulate:a", 0.0, 0.5) func label_ambush1() -> void: var ambush = $"../DeployLayer/AmbushLabel1" _tween_display_label(ambush) func label_ambush2() -> void: var ambush = $"../DeployLayer/AmbushLabel2" _tween_display_label(ambush) func label_ambush3() -> void: var ambush = $"../DeployLayer/AmbushLabel3" _tween_display_label(ambush) func eat_meat() -> void: $"Sfx小蝉哼歌".play() final_label.show() final_label.modulate.a = 0.0 final_meat_ambush.enabled = false var light_pivot = $"../DeployLayer/Ambush最终吃肉/LightPivot" SceneManager.lock_player() var x = final_meat_sprite.global_position.x await SceneManager.get_player().walk_to_x(x).finished var tween = create_tween() tween.tween_interval(1.0) tween.tween_property(final_label, "modulate:a", 1.0, 2.5) # 第一帧没有瘦子,后面才有 var player = SceneManager.get_player() as MainPlayer player.reparent_light(light_pivot) play("eat_meat") await animation_finished # 将 final_label 放置到 transition_layer SceneManager.transition_with_layer(final_label, 2.0, 4.0) await Util.wait(5.0) # c03_meat_grinder: 0:初始化 1:已装转盘 2:胖子游戏结束 3:绞肉机演出 4:演出结束 EventManager.set_stage_if_greater("c03_meat_grinder", 2) SceneManager.unlock_player() SceneManager.get_ground_loader().transition_to_scene("c03_s07", "2") func collapse() -> void: var player = SceneManager.get_player() ambush_collapse.enabled = false # 交互之后,启用 final_meat_ambush final_meat_ambush.enabled = true SceneManager.lock_player() var label = $"../DeployLayer/都一样" label.modulate.a = 0.0 label.show() var camera := SceneManager.get_camera_marker() as CameraFocusMarker var default_limit_rect := camera.default_camera_rect var limit_rect := camera.default_camera_rect limit_rect.position.y -= 100 limit_rect.size.y += 100 camera.apply_limits(limit_rect) if GlobalConfig.DEBUG: print("camera limit_rect:", limit_rect) var tween create_tween().tween_property(label, "modulate:a", 1.0, 2.0) await Util.wait(1.0) Util.timer(1.0, camera.tween_zoom.bind(1.05, 2.0)) camera.set_force_offset_to_target() var target_offset = ambush_collapse.get_node("CameraPivot").global_position - player.global_position tween = create_tween() tween.tween_property(camera, "force_offset", target_offset, 3.0) tween.tween_interval(1.0) await tween.finished collapse_sprite.play() $"Sfx山塌了".play() #TODO SceneManager.pop_debug_dialog_info("音效", "山塌了") await Util.wait(1.5) camera.shake_camera() tween = create_tween() tween.tween_interval(3.0) tween.tween_callback(camera.tween_zoom.bind(1.0, 1.5)) tween.tween_property(camera, "force_offset", Vector2.ZERO, 2.0) await tween.finished SceneManager.unlock_player() camera.apply_limits(default_limit_rect) create_tween().tween_property(label, "modulate:a", 0.0, 1.0)