I’m attempting to make a recreation utilizing Godot the place enemies spawn off-screen, however I confronted this bug the place they spawn on-screen as an alternative.
This is the minimal reproducible instance:
extends Node2D
@export var root: Node2D
@export var max_entities: int
@export var spawn_spots: PackedVector2Array
var _entities: Array[ColorRect]
static func spawn_indices_generator(indices_to_append_to: Array, is_y: bool = true, counter: float = 11, restrict: float = 1500, step: float = 8):
whereas counter < (DisplayServer.window_get_size().y if is_y else DisplayServer.window_get_size().x) + restrict:
indices_to_append_to.append(counter)
counter += step
static func va_pick_random(arr: Variant):
return arr[randi() % arr.size()]
func external_spawn():
return spawn(va_pick_random(spawn_spots) + %participant.place)
func spawn(pos: Vector2):
var node = preload("res://dummy.tscn").instantiate() as ColorRect
%ui.call_deferred("add_child", node)
node.place = pos
return node
func _ready() -> void:
var arr_x: Array[float]
var arr_y: Array[float]
spawn_indices_generator(arr_x, false, -DisplayServer.window_get_size().x, DisplayServer.window_get_size().x, 1)
spawn_indices_generator(arr_y, true, -DisplayServer.window_get_size().y, DisplayServer.window_get_size().y, 1)
var i := 0
whereas i < min(arr_x.dimension(), arr_y.dimension()):
var vector := Vector2(arr_x[i], arr_y[i])
if not Rect2(
Vector2.ZERO,
Vector2(
DisplayServer.window_get_size()
)
).has_point(vector):
spawn_spots.append(vector)
i += 1
print(spawn_spots)
for _j in vary(10):
external_spawn()
external_spawn()
external_spawn()
Scene tree:
- â”–â•´root
- â” â•´ui
- â” â•´spawner (code is on above)
- â”–â•´participant
The white squares are the spawned enemies and the purple is the participant.
I can not change the spawn_indices_array() as a result of I extracted it from some a part of my code, and I concern it will break issues that aren’t supposed right here.
My unique code was (you’ll be able to ignore this):
class_name VirusSpawner extends EntitySpawner
func external_spawn() -> Virus:
print("Accepted")
return spawn(
Virus.VirusInfo.new(
AlgebraicMath.Objectal.va_pick_random(spawn_spots) + participant.place, #Place
root, # Root Scene node
participant, # Participant
5 # Well being
)
)
func spawn(data) -> Virus:
var v = preload("res://scenes/virus.scn").instantiate() as Virus
root.call_deferred("add_child", v)
v.change(data)
return v
func _ready() -> void:
var arr_x: Array[float]
var arr_y: Array[float]
AlgebraicMath.Objectal.spawn_indices_generator(arr_x, false, -DisplayServer.window_get_size().x, DisplayServer.window_get_size().x, 1)
AlgebraicMath.Objectal.spawn_indices_generator(arr_y, true, -DisplayServer.window_get_size().y, DisplayServer.window_get_size().y, 1)
var i := 0
whereas i < min(arr_x.dimension(), arr_y.dimension()):
var vector := Vector2(arr_x[i], arr_y[i])
if not Rect2(
Vector2.ZERO,
Vector2(
DisplayServer.window_get_size()
)
).has_point(vector):
spawn_spots.append(vector)
i += 1
print(spawn_spots)
for _j in vary(10):
external_spawn()
external_spawn()
external_spawn()
