enum State { PATROL, CHASE, ATTACK } var current_state = State.PATROL var can_attack = true
@onready var sprite = $AnimatedSprite2D @onready var attack_timer = $Timer var patrol_direction = -1
func _ready(): if not is_instance_valid(player): push_error("敌人的'player'变量未设置!") if not attack_timer.is_connected("timeout", Callable(self, "_on_timer_timeout")): push_warning("敌人的Timer 'timeout' 信号未连接!")
func _physics_process(delta): if not is_on_floor(): velocity.y += GRAVITY * delta
match current_state: State.PATROL: patrol_state() State.CHASE: chase_state() State.ATTACK: attack_state()
move_and_slide()
func patrol_state(): if is_on_wall(): patrol_direction *= -1 velocity.x = patrol_direction * SPEED set_sprite_direction(patrol_direction) sprite.play("move") if is_player_in_range(ALERT_RANGE): change_state(State.CHASE)
func chase_state(): var direction = get_direction_to_player() velocity.x = direction * SPEED set_sprite_direction(direction) sprite.play("move") if is_player_in_range(ATTACK_RANGE): change_state(State.ATTACK) elif not is_player_in_range(ALERT_RANGE): change_state(State.PATROL)
func attack_state(): velocity.x = 0
if not is_player_in_range(ATTACK_RANGE): change_state(State.CHASE) return