Files
brotato/scenes/unit/enemy/enemy.gd
T
luke358 5cdcf705f4 feat: 1. 添加charge冲锋敌人动画和攻击脚本
2. 添加shoot射击敌人攻击脚本
2026-05-20 15:18:25 +08:00

93 lines
2.2 KiB
GDScript

extends Unit
class_name Enemy
@export var flock_push := 20.0
@onready var vision_area: Area2D = $VisionArea
@onready var knockback_timer: Timer = $KnockbackTimer
var can_move := true
var knockback_dir: Vector2
var knockback_power: float
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
super._ready()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if not can_move:
return
if not can_move_forwards_player():
return
position += (get_move_direction() + knockback_dir * knockback_power) * stats.speed * delta
update_rotate()
func get_move_direction() -> Vector2:
if not is_instance_valid(Global.player):
return Vector2.ZERO
var direction := global_position.direction_to(Global.player.global_position)
for area: Node2D in vision_area.get_overlapping_areas():
if area != self and area.is_inside_tree():
var vector := global_position - area.global_position
direction += flock_push * vector.normalized() / vector.length()
return direction
func update_rotate() -> void:
print("11111111")
if !is_instance_valid(Global.player):
return
var player_pos := Global.player.position
var moving_right := global_position.x < player_pos.x
print(moving_right, '111111')
visuals.scale = Vector2(-0.5,0.5) if moving_right else Vector2(0.5,0.5)
func can_move_forwards_player() -> bool:
return is_instance_valid(Global.player) and\
global_position.distance_to(Global.player.position) > 60
func apply_knockback(knock_dir: Vector2, knock_power: float) -> void:
knockback_dir = knock_dir
knockback_power = knock_power
if knockback_timer.time_left > 0:
knockback_timer.stop()
reset_knockback()
knockback_timer.start()
func reset_knockback() -> void:
knockback_dir = Vector2.ZERO
knockback_power = 0
func _on_knockback_timer_timeout() -> void:
reset_knockback()
func _on_hurtbox_component_on_damaged(hitbox: HitboxComponent) -> void:
super._on_hurtbox_component_on_damaged(hitbox)
if hitbox.knockback_power > 0:
var dir := hitbox.source.global_position.direction_to(global_position)
apply_knockback(dir, hitbox.knockback_power)