7.5 C
New York
Tuesday, November 18, 2025

Enemy spawning onscreen in Godot 4.5


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

Output:

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()

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles