godot-ex1/Enemies/Bat.gd

71 lines
1.6 KiB
GDScript

extends KinematicBody2D
const DeathEffect = preload("res://Effects/EnemyDeathEffect.tscn")
var knockback = Vector2.ZERO
var velocity = Vector2.ZERO
onready var stats = $Stats
onready var player_detector = $PlayerDetectionZone
onready var sprite = $AnimatedSprite
onready var original_position = global_position
export(int) var acceleration = 300
export(int) var max_speed = 300
export(int) var friction = 200
enum {
IDLE,
MOVE,
CHASE,
MOVE_BACK
}
onready var state = IDLE
func _physics_process(delta):
knockback = knockback.move_toward(Vector2.ZERO, 200 * delta)
knockback = move_and_slide(knockback)
match state:
IDLE:
velocity = velocity.move_toward(Vector2.ZERO, friction)
seek_player()
MOVE_BACK:
# TODO: Navigation here
pass
MOVE:
pass
CHASE:
var player = player_detector.player
if player != null:
var direction = (player.global_position - global_position).normalized()
velocity = velocity.move_toward(direction * max_speed, acceleration * delta)
sprite.flip_h = velocity.x < 0
else:
state = IDLE
velocity = move_and_slide(velocity)
func around_the_original_position():
return abs(original_position.x - global_position.x) < 5 and abs(original_position.y - global_position.y) < 5
func seek_player():
if player_detector.is_player_detected():
state = CHASE
func _on_HurtBox_area_entered(area):
stats.health -= area.damage
knockback = area.knockback_vector * 120
func _on_Stats_no_health():
queue_free()
var effect = DeathEffect.instance()
get_parent().add_child(effect)
effect.global_position = global_position