How to respawn enemies if player re-entered the room

Godot Version

<stable4.2>

Question

<Im trying to make enemy respawn system. I only want to respawn enemies whenever player re-entered room just like a regular metroidvania game.
right now, the level scene is divided by several area2d representing rooms. Whenever player entered specific room, the camera will transition to new room. For enemy right now, will spawn from ObjSpawner which is a scene of Node2D and VisibleOnScreenNotifier2D, when received screen entered signal. Enemies will queue free when killed or player exited room receiving area exited signal from room.
The problem is ObjSpawner is listening to all signal from all rooms queue freeing everytime exited room resulting no enemies to spawned. How can I assign objspawner to each room and only spawn and respawn enemies of that room.


スクリーンショット 2024-07-28 213400

you can pass an argument “room_number” to the signal and assign every objSpawner a room_number. Then you can check if the room_number == objSpawner.room_number

I came up with an idea of appending ObjSpawner to Level Scene script and calling in each area2d signals. I would like to know which is better way to do.

var spawners01 = []
var spawners02 = []
func _ready():
    spawners01.append($ObjSpawner1)
    spawners01.append($ObjSpawner2)
    spawners01.append($ObjSpawner3)
    spawners02.append($ObjSpawner4)
    spawners02.append($ObjSpawner5)
    ...

func _on_room01_area_entered(area):
    for spawner in spawners01:
        spawner.spawn_object()

func _on_room01_area_exited(area):
    for spawner in spawners01:
        spawner.remove_all_objects()

func _on_room02_area_entered(area):
    for spawner in spawners02:
        spawner.spawn_object()

func _on_room02_area_exited(area):
    for spawner in spawners02:
        spawner.remove_all_objects()

in this case you can make things easier, by only using 1(2)-method('s):

func _on_room_area_entered(area, room_number):
    match room_number:
        1:
            for spawner in spawners01:
                spawner.spawn_object
        2:
            ...

You just have to bind the room_number-argument to the method, either by code or by the editor

EDIT: or even easier:

func _on_room_area_entered(area, room_number):
    for spawner in spawners[room_number]:
        spawner.spawn_object()

In this case you would have a list of [spawners01, spawners02, …] called “spawners”

2 Likes

with that I only need one receiver method? also, how can i assign room_number argument?

in the inspector you can use the advance setting when you click on a signal, in code you can do it this way:

room_area.area_entered.connect(_on_room_area_entered.bind(room_area.room_number))

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