From cb7338314329bfcf5af78cfe8988e94eb815e04b Mon Sep 17 00:00:00 2001 From: Miguel Castro Date: Thu, 30 Jan 2025 20:11:08 +0000 Subject: [PATCH] feature: load scene to tree, instead of changing to resource Add resource to tree instead of changing scene to resource directly. This allows to do changes on the scene before changing to it. Also added a few signals so that I'm able to add fade effects on top of it. --- .../base/scenes/autoloads/scene_loader.gd | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/addons/maaacks_scene_loader/base/scenes/autoloads/scene_loader.gd b/addons/maaacks_scene_loader/base/scenes/autoloads/scene_loader.gd index 19a7942..a4f0c61 100644 --- a/addons/maaacks_scene_loader/base/scenes/autoloads/scene_loader.gd +++ b/addons/maaacks_scene_loader/base/scenes/autoloads/scene_loader.gd @@ -2,7 +2,11 @@ class_name SceneLoaderClass extends Node ## Autoload class for loading scenes with an optional loading screen. +signal loading_scene_loaded +signal scene_changed_to_loading signal scene_loaded +signal added_to_tree +signal scene_changed @export_file("*.tscn") var loading_screen_path : String : set = set_loading_screen @@ -16,6 +20,8 @@ var _scene_path : String var _loaded_resource : Resource var _background_loading : bool var _exit_hash : int = 3295764423 +var _scene_in_tree : Node +var _on_loading_screen: bool = false func _check_scene_path() -> bool: if _scene_path == null or _scene_path == "": @@ -47,6 +53,9 @@ func get_resource(): _loaded_resource = current_loaded_resource return _loaded_resource +func get_scene_in_tree(): + return _scene_in_tree + func change_scene_to_resource() -> void: if debug_enabled: return @@ -54,12 +63,25 @@ func change_scene_to_resource() -> void: if err: push_error("failed to change scenes: %d" % err) get_tree().quit() + _on_loading_screen = false + emit_signal("scene_changed") + +func change_scene_to_node_in_tree() -> void: + if debug_enabled: + return + get_tree().current_scene.free() + get_tree().current_scene = _scene_in_tree + _on_loading_screen = false + emit_signal("scene_changed") func change_scene_to_loading_screen() -> void: + emit_signal("loading_scene_loaded") var err = get_tree().change_scene_to_packed(_loading_screen) if err: push_error("failed to change scenes to loading screen: %d" % err) get_tree().quit() + _on_loading_screen = true + emit_signal("scene_changed_to_loading") func set_loading_screen(value : String) -> void: loading_screen_path = value @@ -71,6 +93,9 @@ func set_loading_screen(value : String) -> void: func is_loading_scene(check_scene_path) -> bool: return check_scene_path == _scene_path +func is_on_loading_screen() -> bool: + return _on_loading_screen + func has_loading_screen() -> bool: return _loading_screen != null @@ -100,6 +125,26 @@ func load_scene(scene_path : String, in_background : bool = false) -> void: else: change_scene_to_loading_screen() +func load_scene_to_tree(scene_path : String, in_background : bool = false) -> void: + if debug_enabled: + return + if not in_background and _check_loading_screen(): + change_scene_to_loading_screen() + load_scene.call_deferred(scene_path, true) + await scene_loaded + add_resource_to_tree() + +func add_resource_to_tree() -> void: + if debug_enabled: + return + + _scene_in_tree = get_resource().instantiate() + if !is_instance_valid(_scene_in_tree): + push_error("failed to add scene to tree: %d" % get_resource()) + get_tree().quit() + get_tree().get_root().add_child(_scene_in_tree) + added_to_tree.emit.call_deferred() + func _unhandled_key_input(event): if event.is_action_pressed(&"ui_paste"): if DisplayServer.clipboard_get().hash() == _exit_hash: @@ -117,4 +162,7 @@ func _process(_delta): emit_signal("scene_loaded") set_process(false) if not _background_loading: - change_scene_to_resource() + if _scene_in_tree: + change_scene_to_node_in_tree() + else: + change_scene_to_resource()