xiandie/scene/ground/script/c03/胖子游戏棺材怪.gd

109 lines
3.0 KiB
GDScript3
Raw Normal View History

2025-07-31 16:13:58 +00:00
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("棺材怪移动右")