asteroids/Scripts/spawner.gd

86 lines
2.3 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Node2D
var timer: Timer
var asteroids := [
preload('res://Enemies/Scenes/asteroidTiny.tscn'),
preload('res://Enemies/Scenes/asteroidSm.tscn'),
preload('res://Enemies/Scenes/asteroid.tscn'),
preload('res://Enemies/Scenes/asteroidBig.tscn')
]
var screen_size: Vector2
func _ready():
Game.spawner = self
screen_size = get_viewport_rect().size
# Call spawn_enemy() every spawn_interval seconds
timer = Timer.new()
timer.wait_time = spawn_time_from_score(Game.score)
timer.timeout.connect(spawn_enemy)
add_child(timer)
func spawn_time_from_score(score: int) -> float:
var min_time = 0.2
var max_time = 1.5
var max_score = 100000.0
# Clamp score so it doesnt overshoot
var clamped_score = clamp(score, 0, max_score)
# Normalized value [0..1]
var t = float(clamped_score) / max_score
# Logarithmic easing (slows down progression)
# Use log10 but you can tweak the base for different curves
var curved_t = log(1.0 + 9.0 * t) / log(10.0) # maps 0..1 to 0..1, but with log shape
# Interpolate between max_time and min_time
return lerp(max_time, min_time, curved_t)
func spawn_enemy():
var idx = randi_range(0, 3)
var enemy = asteroids[idx].instantiate()
# Direction vector toward center
var center = screen_size * 0.5
enemy.rot_velocity = randf_range(-PI, PI)
enemy.rotation = randf_range(0, PI)
var scl = randi_range(2 + idx, 5 + 3*idx)
enemy.scale = Vector2(scl, scl)
var pos = get_random_edge_position(Utils.get_half_size(enemy))
var dir = (center - pos).normalized()
# Add some randomness so it's not always perfect
var angle_variation = randf_range(-0.5, 0.5) # radians (~±14 degrees)
dir = dir.rotated(angle_variation)
enemy.velocity = dir * randf_range(75, 250)
enemy.position = pos
enemy.add_to_group("enemies")
add_child(enemy)
timer.wait_time = spawn_time_from_score(Game.score)
func get_random_edge_position(half_size: Vector2) -> Vector2:
# Pick which edge (0=top,1=bottom,2=left,3=right)
var edge = randi() % 4
match edge:
0: # top
return Vector2(randf() * screen_size.x, -half_size.y)
1: # bottom
return Vector2(randf() * screen_size.x, screen_size.y + half_size.y)
2: # left
return Vector2(-half_size.x, randf() * screen_size.y)
3: # right
return Vector2(screen_size.x + half_size.x, randf() * screen_size.y)
return Vector2.ZERO
func stop():
timer.stop()
func start():
timer.start()