How do I make randomized timed spawning?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Sabir_The_Trubbish

Here is my code

extends Navigation2D

var speed = -0.2
var velocity = Vector2.ZERO

var spawnX = RandomNumberGenerator.new()

var score = 0

func ready():
pass

func _process(delta):
move_local_x(speed)

func enemySpawn():
spawnX.randomize()
var xSpawn = spawnX.randf_range(-720.0, 1000.0)
var Enemy = load(“res://Enemy/Enemy.tscn”)
var enemy = Enemy.instance()
get_parent().add_child(enemy)

func _on_Hurtbox_area_entered(area):
score = score + 1
queue_free()
print(score)

Can you describe exact task?

p.s. randomize() should be called only once, at startup, like in _ready().
The same about var Enemy = load("res://Enemy/Enemy.tscn"), unless you load different scenes: you load it once and instance() and add_child() at the spawn moment.

sash-rc | 2021-07-13 21:21

I need to use the random numbers generated to make the x and y positions randomized.

Sabir_The_Trubbish | 2021-07-13 21:23

Please indent your code by wrapping with <pre><code>my code</code></pre> and indent properly :slight_smile:

clemens.tolboom | 2021-07-14 15:33

Ok, I will keep that in mind for later

Sabir_The_Trubbish | 2021-07-14 15:34

:bust_in_silhouette: Reply From: clemens.tolboom

You can use yield with timer and a loop. Note I reuse your rng. Guess you need some more logic to prevent multiple enemies?

...
var player_dead :bool = false
....
func start_spawning():
    while not player_dead:
        var random_delay : float = spawnX.randfrange(0.1, 2.0)
        yield(get_tree().create_timer(random_delay), "timeout")
        enemySpawn() # create one enemy

I used your code and the game started to crash when the enemy was destroyed. I added randomized Y positions to the RNG.

extends Navigation2D


var speed = -0.2
var velocity = Vector2.ZERO

var spawnX = RandomNumberGenerator.new()
var spawnY = RandomNumberGenerator.new()

var score = 0

func ready():
	pass

func _process(delta):
	move_local_x(speed)

func enemySpawn():
	spawnX.randomize()
	spawnY.randomize()
	var xSpawn = spawnX.randf_range(720.0, 1000.0)
	var ySpawn = spawnY.randf_range(80.0, 290)
	
	var Enemy = load("res://Enemy/Enemy.tscn")
	var enemy = Enemy.instance()
	enemy.x = xSpawn
	enemy.y = ySpawn
	get_parent().add_child(enemy)


var player_dead :bool = false

func start_spawning():
	while not player_dead:
		var random_delay : float = spawnX.randfrange(0.1, 2.0)
		yield(get_tree().create_timer(random_delay), "timeout")

func _on_Hurtbox_area_entered(area):
	enemySpawn()
        start_spawning()
	score = score + 1
	queue_free()
	print(score)

Sabir_The_Trubbish | 2021-07-14 16:00

I forgot to spawn enemies so updated my answer.


func _on_Hurtbox_area_entered(area):
    player_dead = false
    player_in_hurtbox = true
    start_spawning()
    score = score + 1
    # queue_free()
    print(score)

Your code is doing queue_free() when entering (guess that is the crash) … that is not logical is it? Guess that is for _area_exited. My player_dead should be named player_in_hurtbox


func _on_Hurtbox_area_exited(area):
    # player_dead = true
    player_in_hurtbox = false
    score = score + 1
    queue_free()
    print(score)

clemens.tolboom | 2021-07-14 19:59

:bust_in_silhouette: Reply From: sash-rc

I need to use the random numbers generated to make the x and y positions randomized.

onready var randomGen : RandomNumberGenerator = RandomNumberGenerator.new()
onready var prototype : PackedScene  = load("res://scene.tscn")

func _ready() -> void:
  randomGen.randomize()

func spawn() -> void:
  var pos : Vector2 = Vector2(randomGen.randf_range(-100, 100), randomGen.randf_range(-100, 100))
  var spawnedItem : Node2D = prototype.instance()
  get_parent().add_child(spawnedItem)
  spawnedItem.position = pos