Skip to content

Instantly share code, notes, and snippets.

@Janglee123
Created January 1, 2020 16:00
Show Gist options
  • Save Janglee123/7d097237a0c64925a01b8bb84040830a to your computer and use it in GitHub Desktop.
Save Janglee123/7d097237a0c64925a01b8bb84040830a to your computer and use it in GitHub Desktop.
Godot Level Loader
extends Node
onready var scene_tree: = get_tree()
var _path: = "res://src/Levels/Levels/"
var _levels: = []
var _level_index: = -1
var _level
var _container
func _ready() -> void:
_levels = get_scenes_in_directory(_path)
Events.connect("level_finished", self, "_on_level_finished")
func setup(container: Node2D, level: = 0) -> void:
_container = container
load_level(level)
func _on_level_finished() -> void:
var next_level = clamp(_level_index + 1, 0, _levels.size() - 1)
load_level(next_level)
func get_scenes_in_directory(path) -> Array:
var files: = []
var dir: = Directory.new()
dir.open(path)
dir.list_dir_begin(true, true)
while true:
var file = dir.get_next()
if file == "":
break
elif file.ends_with(".tscn"):
file = path + file
files.append(file)
dir.list_dir_end()
return files
func load_level(new_level_index: int) -> void:
if _level:
scene_tree.paused = true
_level.queue_free()
yield(_level, "tree_exited")
_level_index = new_level_index
var new_level = load(_levels[_level_index])
_level = new_level.instance()
_container.call_deferred('add_child',_level)
scene_tree.paused = false
Events.emit_signal("level_loaded", _level_index)
func reset_level() -> void:
load_level(_level_index)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment