game: improve enemy-manager

This commit is contained in:
2025-08-21 06:11:09 +02:00
parent 83e2067fea
commit f0f717e00e
5 changed files with 63 additions and 4 deletions

View File

@@ -4,6 +4,7 @@ extends Node2D
@export var max_enemies: int
@export var spawn_rate: float
@export var target: CollisionObject2D
@export var camera: Camera2D
@onready var timer: Timer = $Timer
@@ -22,11 +23,61 @@ func _on_timer_timeout() -> void:
GlobalConst.sig_debug_stats_set.emit("enemy_count", "%s" % len(enemies))
if len(enemies) < max_enemies:
var new_enemy = ENEMY_RAT.instantiate()
new_enemy.position = target.position + Vector2(50, 50)
new_enemy.position = _get_spawn_pos()
new_enemy.target = target
add_child(new_enemy)
func _get_spawn_pos() -> Vector2:
var rect = _get_camera_rect()
var side = randi() % 4
var margin = 50
var pos: Vector2
match side:
0: # Top
pos = Vector2(
randf_range(rect.position.x, rect.position.x + rect.size.x),
rect.position.y - margin
)
1: # Bottom
pos = Vector2(
randf_range(rect.position.x, rect.position.x + rect.size.x),
rect.position.y + rect.size.y + margin
)
2: # Left
pos = Vector2(
rect.position.x - margin,
randf_range(rect.position.y, rect.position.y + rect.size.y)
)
3: # Right
pos = Vector2(
rect.position.x + rect.size.x + margin,
randf_range(rect.position.y, rect.position.y + rect.size.y)
)
if !_is_pos_valid(pos):
pos = _get_spawn_pos()
return pos
func _is_pos_valid(pos: Vector2) -> bool:
var space = get_world_2d().direct_space_state
var parameters = PhysicsPointQueryParameters2D.new()
parameters.collide_with_areas = false
parameters.collide_with_bodies = true
parameters.collision_mask = 1
parameters.position = pos
var result = space.intersect_point(parameters, 1)
return result.size() == 0
func _get_camera_rect() -> Rect2:
var viewport_size = camera.get_viewport_rect().size
var half_size = viewport_size * 0.5
var top_left = camera.global_position - half_size
return Rect2(top_left, viewport_size)
func _on_stop_spawning(val: bool):
if val:
timer.stop()