60 lines
2.2 KiB
GDScript

extends Node2D
const WORLD_SIZE := Vector2(5200.0, 3600.0)
const ENEMY_COUNT := 20
const SAFE_ZONE_RADIUS := 440.0
const ENEMY_MIN_SEPARATION := 240.0
const ENEMY_SCENE := preload("res://scenes/game/enemy_ship.tscn")
const ENEMY_TEXTURES: Array[Texture2D] = [
preload("res://assets/alien ship/Ship_1.png"),
preload("res://assets/alien ship/Ship_2.png"),
preload("res://assets/alien ship/Ship_3.png"),
preload("res://assets/alien ship/Ship_4.png"),
preload("res://assets/alien ship/Ship_5.png"),
preload("res://assets/alien ship/Ship_6.png"),
preload("res://assets/alien ship/Ship_7.png"),
preload("res://assets/alien ship/Ship_8.png"),
preload("res://assets/alien ship/Ship_9.png"),
preload("res://assets/alien ship/Ship_10.png"),
preload("res://assets/alien ship/Ship_11.png"),
]
@onready var player: CharacterBody2D = $PlayerShip
func _ready() -> void:
# Keep the camera limits aligned with the test map if its size is tuned later.
var camera := player.get_node_or_null("Camera2D") as Camera2D
if camera:
camera.limit_left = int(-WORLD_SIZE.x * 0.5)
camera.limit_right = int(WORLD_SIZE.x * 0.5)
camera.limit_top = int(-WORLD_SIZE.y * 0.5)
camera.limit_bottom = int(WORLD_SIZE.y * 0.5)
_spawn_enemies()
func _spawn_enemies() -> void:
var rng := RandomNumberGenerator.new()
rng.randomize()
var spawn_positions: Array[Vector2] = []
var attempts := 0
while spawn_positions.size() < ENEMY_COUNT and attempts < 3000:
attempts += 1
var candidate := Vector2(
rng.randf_range(-WORLD_SIZE.x * 0.5 + 130.0, WORLD_SIZE.x * 0.5 - 130.0),
rng.randf_range(-WORLD_SIZE.y * 0.5 + 130.0, WORLD_SIZE.y * 0.5 - 130.0)
)
if candidate.length_squared() < SAFE_ZONE_RADIUS * SAFE_ZONE_RADIUS:
continue
var too_close := false
for other_position in spawn_positions:
if candidate.distance_squared_to(other_position) < ENEMY_MIN_SEPARATION * ENEMY_MIN_SEPARATION:
too_close = true
break
if not too_close:
spawn_positions.append(candidate)
for spawn_position in spawn_positions:
var enemy := ENEMY_SCENE.instantiate() as CharacterBody2D
enemy.position = spawn_position
add_child(enemy)
enemy.call("configure", player, ENEMY_TEXTURES[rng.randi_range(0, ENEMY_TEXTURES.size() - 1)])