86 lines
2.3 KiB
GDScript
86 lines
2.3 KiB
GDScript
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 doesn’t 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()
|