extends AnimatedSprite2D const MOVE_SPEED := 120.0 const RESET_Y := 300.0 @export var mute := true: set(val): mute = val if not is_node_ready(): return if mute: footstep_sfx.volume_db = -100 else: footstep_sfx.reset_volumn_to_default() @export var move_target: Node2D @export_enum("left", "right") var hand_mode := 0 @export var left_side_sprite: AnimatedSprite2D @export var right_side_sprite: AnimatedSprite2D @export var left_area: Area2D @export var right_area: Area2D @onready var footstep_sfx = $"Sfx2D棺材怪脚步声" as Sfx2D @onready var chop_sfx = $"Sfx2D棺材怪切刀" as Sfx2D @onready var remote_body = $"身子" as RemoteTransform2D @onready var remote_left_side = $"左侧" as RemoteTransform2D @onready var remote_right_side = $"右侧" as RemoteTransform2D @onready var remote_left_shadow = $"左落点" as RemoteTransform2D @onready var remote_right_shadow = $"右落点" as RemoteTransform2D var left_hand_x_offset: float var right_hand_x_offset: float func _ready() -> void: left_hand_x_offset = remote_left_shadow.position.x right_hand_x_offset = remote_right_shadow.position.x left_area.body_entered.connect(_on_player_chopped) right_area.body_entered.connect(_on_player_chopped) # 停止切肉动作, x 对齐到 move_target func refresh_monster() -> void: global_position.x = move_target.global_position.x remote_right_side.position.y = RESET_Y remote_left_side.position.y = RESET_Y remote_left_shadow.scale = Vector2.ZERO remote_right_shadow.scale = Vector2.ZERO func aim_left() -> void: var tween = create_tween() tween.tween_property(remote_left_shadow, "scale", Vector2.ONE, 1.0) func aim_right() -> void: var tween = create_tween() tween.tween_property(remote_right_shadow, "scale", Vector2.ONE, 1.0) func chop_left() -> void: left_side_sprite.play() var tween = create_tween() tween.tween_property(remote_left_side, "position:y", 0.0, 0.2) tween.tween_callback(chop_sfx.play) tween.tween_callback(shake) tween.tween_interval(1.0) tween.tween_property(remote_left_side, "position:y", RESET_Y, 1.0) func chop_right() -> void: right_side_sprite.play() var tween = create_tween() tween.tween_property(remote_right_side, "position:y", 0.0, 0.2) tween.tween_callback(chop_sfx.play) tween.tween_callback(shake) tween.tween_interval(1.0) tween.tween_property(remote_right_side, "position:y", RESET_Y, 1.0) func shake() -> void: SceneManager.get_camera_marker().shake_camera(4.0) func _on_player_chopped(_body) -> void: SceneManager.lock_player() await SceneManager.player_action(7) await Util.wait(1.0) SceneManager.unlock_player() # restart get_tree().reload_current_scene() func _physics_process(delta: float) -> void: var target_x = move_target.global_position.x var x = global_position.x if target_x == x: stop() if footstep_sfx.playing: footstep_sfx.stop() else: global_position.x = move_toward(x, target_x, delta * MOVE_SPEED) if not footstep_sfx.playing: footstep_sfx.play() if not is_playing(): if hand_mode == 0: play("棺材怪移动") else: play("棺材怪移动右")