97 lines
1.9 KiB
GDScript
97 lines
1.9 KiB
GDScript
extends Node2D
|
|
|
|
@export var enabled := true
|
|
# 追击开始距离
|
|
@export var start_distance := 400
|
|
# 追击开始方位(左/右)
|
|
@export var from_left := true
|
|
# 追击速度
|
|
@export var speed := 30
|
|
# 脚步声周期时间
|
|
@export var footstep_wait_time := 0.7
|
|
|
|
@onready var sfx_footstep = $SfxFootstep as Sfx
|
|
|
|
var footstep_timer
|
|
|
|
|
|
func _ready() -> void:
|
|
var player = SceneManager.get_player()
|
|
# 高度对齐
|
|
position.y = player.position.y
|
|
# 脚步声 timer
|
|
footstep_timer = Timer.new()
|
|
footstep_timer.autostart = false
|
|
footstep_timer.wait_time = footstep_wait_time
|
|
add_child(footstep_timer)
|
|
footstep_timer.timeout.connect(_on_footstep_timer_timeout)
|
|
|
|
|
|
func _on_footstep_timer_timeout() -> void:
|
|
sfx_footstep.play()
|
|
# shake camera
|
|
|
|
|
|
# 启用/禁用脚步声
|
|
func toggle_footstep_sfx(play := true):
|
|
if play:
|
|
footstep_timer.start()
|
|
else:
|
|
footstep_timer.stop()
|
|
|
|
|
|
var move_tween: Tween
|
|
|
|
|
|
# 开始追击
|
|
func start_chasing() -> void:
|
|
toggle_footstep_sfx(true)
|
|
# 初始位置与方向
|
|
|
|
|
|
# 停止追击
|
|
func stop_chasing() -> void:
|
|
toggle_footstep_sfx(false)
|
|
|
|
|
|
# 转身追击
|
|
func turn_back():
|
|
# 呼吸一帧,然后转身
|
|
pass
|
|
|
|
|
|
# 正在抓取
|
|
var catching = false
|
|
# 检测到猫钻进盒子的过程
|
|
var cat_hiding_detacted = false
|
|
|
|
var catch_x_range = Vector2(5, 10)
|
|
|
|
|
|
func detact_pos(player_pos: Vector2):
|
|
if catching:
|
|
return
|
|
var signed_x_diff = (player_pos.x - position.x) * sign(position.x)
|
|
|
|
# 检查是否需要转身
|
|
|
|
# 检查盒子猫状态
|
|
cat_hiding_detacted = true
|
|
# 如果离开一定范围,重置 catch_box_cat
|
|
cat_hiding_detacted = false
|
|
|
|
# 检查是否抓取
|
|
if cat_hiding_detacted and is_in_range(signed_x_diff, catch_x_range):
|
|
catching = true
|
|
|
|
if not catching:
|
|
return
|
|
# 如果距离近,先走到对应位置,然后使用 猪头怪抓盒子猫
|
|
|
|
# 距离近,使用 猪头怪抓盒子猫后段 直接抓取
|
|
|
|
|
|
|
|
func is_in_range(x: float, x_range: Vector2) -> bool:
|
|
return x > x_range.x and x < x_range.y
|