Connect Game Levels

Published on March 29, 2026

Code Snippets

level_manager.gd

extends Node


## A list of all level scene file names
const LEVELS := [
  'Level_0.scn',
  'Level_1.scn',
]


## the base path to all ldtk generated level scenes
const LEVEL_PATH := 'res://ldtk/levels'


## Currently loaded level Node reference
var _current_level: Node2D


## References the current level's index in the LEVELS array.
## Starts at -1 so we can use `load_next_level()` at the start of the game.
var _current_level_index: int = -1


## The root node that contains all levels
var _level_root:
  Node2D:
    get:
      var level_roots = get_tree().get_nodes_in_group('level_root')
      assert(level_roots.size() == 1, 'Level root count not met: %d' % level_roots.size())
      return level_roots[0]


func load_next_level():
  _current_level_index = _current_level_index + 1
  if _current_level_index >= LEVELS.size():
    _current_level_index = 0

  var next_level = LEVELS[_current_level_index]
  _load_level(next_level)


func _load_level(level_name:
  String):
    _unload_level()
    var next_level_name = '{LEVEL_PATH}/{level_name}'.format({
    'LEVEL_PATH': LEVEL_PATH,
    'level_name': level_name
})
var next_level: PackedScene = load(next_level_name)
_current_level = next_level.instantiate()
_level_root.add_child(_current_level)


func _unload_level():
  if is_instance_valid(_current_level):
    _current_level.queue_free()

exit.gd

extends Node2D


func _ready():
	connect('body_entered', _on_body_entered)


func _on_body_entered(body):
	LevelManager.load_next_level()

main.gd

extends Node2D


func _ready():
	LevelManager.load_next_level()