Trouble with spawners

Im trying to make obstacles in my horizontal sidescroller come in waves. The obstacles come from marker2ds. Im trying to use loops and a timer to make a primitive wave system but instead spawning obstacles after a set amount of time each loop the obstacles(other than the first 2) arent coming out at all.

extends Node

@export var bat_scene: PackedScene
@export var spike_scene: PackedScene
@onready var wave_timer: Timer = $waves
@onready var bat1 = $bat_point1
@onready var bat2 = $bat_point2
@onready var bat3 = $bat_point3
@onready var bat4 = $bat_point4
@onready var bat5 = $bat_point5
@onready var bat6 = $bat_point6
@onready var spike1 = $spike_point1
var waves = 10


func _ready() -> void:
	var start = 0
	spawn(bat_scene)
	spawn(spike_scene)
	while start < waves:
		start += 1
		print(start)
		wave_timer.start()
		if wave_timer.time_left <= 0:
			print("success")
			spawn(bat_scene)
			spawn(spike_scene)

func spawn(type):
	print("just checking")
	if type == bat_scene:
		spawn_bats()
	elif type == spike_scene:
		spawn_spikes()
		
func spawn_bats():
	var spawn1 = bat_scene.instantiate()
	add_child(spawn1)
	spawn1.global_position = bat1.global_position
	print("hello bat")
	var spawn2 = bat_scene.instantiate()
	add_child(spawn2)
	spawn2.global_position = bat2.global_position
	print("hello bat2")
	var spawn3 = bat_scene.instantiate()
	add_child(spawn3)
	spawn3.global_position = bat3.global_position
	print("hello bat3")
	var spawn4 = bat_scene.instantiate()
	add_child(spawn4)
	spawn4.global_position = bat4.global_position
	print("hello bat4")
	var spawn5 = bat_scene.instantiate()
	add_child(spawn5)
	spawn5.global_position = bat5.global_position
	print("hello bat5")
	var spawn6 = bat_scene.instantiate()
	add_child(spawn6)
	spawn6.global_position = bat6.global_position
	print("hello bat6")

func spawn_spikes():
	var spawn1 = spike_scene.instantiate()
	add_child(spawn1)
	spawn1.global_position = spike1.global_position
	print("hello bat6")

This is whats printed:
just checking, hello bat, hello bat2, hello bat3, hello bat4, hello bat5, hello bat6, just checking, hello, bat6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

You’re not waiting for the timer anywhere in your code, your entire while loop is done within the first frame. Something like this should work, assuming the rest of the code works properly.

func _ready() -> void:
	var start = 0
	spawn(bat_scene)
	spawn(spike_scene)
	while start < waves:
		start += 1
		print(start)
		wave_timer.start()
		await wave_timer.timeout
		print("success")
		spawn(bat_scene)
		spawn(spike_scene)
1 Like

This worked perfectly. Thanks a lot.

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.