feat: Implement core game mechanics including player, enemies, bullets, HUD, and level setup.

This commit is contained in:
2025-11-21 13:18:53 +01:00
commit 245e3e141d
39 changed files with 823 additions and 0 deletions

65
scripts/enemy.gd Normal file
View 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()