60 lines
2.2 KiB
GDScript
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)])
|