feat: Implement core game mechanics including player, enemies, bullets, HUD, and level setup.
This commit is contained in:
65
scripts/enemy.gd
Normal file
65
scripts/enemy.gd
Normal file
@@ -0,0 +1,65 @@
|
||||
extends CharacterBody2D
|
||||
|
||||
@export var speed: float = 100.0
|
||||
@export var max_health: float = 100.0
|
||||
var current_health: float
|
||||
|
||||
var player: Node2D
|
||||
@onready var health_bar = $HealthBar
|
||||
@onready var turret = $Turret
|
||||
|
||||
@export var bullet_scene: PackedScene = preload("res://scenes/bullet.tscn")
|
||||
@export var fire_rate: float = 2.0
|
||||
var can_shoot: bool = true
|
||||
|
||||
func _ready():
|
||||
add_to_group("enemy")
|
||||
current_health = max_health
|
||||
if health_bar:
|
||||
health_bar.max_value = max_health
|
||||
health_bar.value = current_health
|
||||
health_bar.hide() # Hide initially, show on damage
|
||||
|
||||
# Find the player in the scene tree
|
||||
player = get_tree().get_first_node_in_group("player")
|
||||
if not player:
|
||||
# Fallback: try to find by name if group not set
|
||||
player = get_parent().get_node_or_null("player")
|
||||
|
||||
func _physics_process(_delta):
|
||||
if player:
|
||||
var direction = (player.global_position - global_position).normalized()
|
||||
velocity = direction * speed
|
||||
rotation = direction.angle()
|
||||
move_and_slide()
|
||||
|
||||
# Aim turret at player
|
||||
if turret:
|
||||
turret.look_at(player.global_position)
|
||||
|
||||
# Shoot if close enough
|
||||
if global_position.distance_to(player.global_position) < 400.0 and can_shoot:
|
||||
shoot()
|
||||
|
||||
func shoot():
|
||||
var bullet = bullet_scene.instantiate()
|
||||
bullet.shooter_group = "enemy"
|
||||
get_tree().root.add_child(bullet)
|
||||
bullet.global_position = turret.global_position
|
||||
bullet.global_rotation = turret.global_rotation
|
||||
|
||||
can_shoot = false
|
||||
await get_tree().create_timer(fire_rate).timeout
|
||||
can_shoot = true
|
||||
|
||||
func take_damage(amount: float):
|
||||
current_health -= amount
|
||||
if health_bar:
|
||||
health_bar.show()
|
||||
health_bar.value = current_health
|
||||
|
||||
if current_health <= 0:
|
||||
die()
|
||||
|
||||
func die():
|
||||
queue_free()
|
||||
Reference in New Issue
Block a user