- Edited
Hello, I've created a level switcher, and it works when I switch from level 1 to 2 but it doesn't do anything when I try to go from level 2 to level 3
Here's my level switcher code :
extends Node
var next_level = null
@onready var current_level = $Level_1
@onready var anim = $AnimationPlayer
func _ready():
current_level.level_changed.connect(self.handle_level_changed)
$MusicWorld1.play()
func handle_level_changed(current_level_name: String):
var next_level_name: String
match current_level_name:
"level1":
next_level_name = "2.tscn"
"level2":
next_level_name = "3.tscn"
_:
return
next_level = load("res://levels/level_" + next_level_name).instantiate()
next_level.visible = false
add_child(next_level)
anim.play("fade_in")
next_level.level_changed.connect(self.handle_level_changed)
func _on_animation_player_animation_finished(anim_name):
match anim_name:
"fade_in":
current_level.cleanup()
current_level = next_level
current_level.visible = true
next_level = null
anim.play("fade_out")
"fade_out":
pass
Here is my level script that is attached to all my levels :
extends Node2D
signal level_changed(level_name)
@export var level_name = "level"
func cleanup():
if $DescendingSound.playing:
await $DescendingSound.finished
queue_free()
func _on_door_change_scene():
$DescendingSound.play()
emit_signal("level_changed", level_name)
And here is my door script, attached to my door in my levels. To switch between levels the player must touch the door :
extends Area2D
signal changeScene
func _on_body_entered(body):
if not ($Timer.time_left > 0):
if body.is_in_group("player"):
$AnimatedSprite2D.play("default")
await get_tree().create_timer(1.5).timeout
changeScene.emit()