Browse Source

scene switcher demo changed to reflect tutorial, fixes #1673

Juan Linietsky 10 years ago
parent
commit
a3aefa4eee
1 changed files with 27 additions and 9 deletions
  1. 27 9
      misc/autoload/global.gd

+ 27 - 9
misc/autoload/global.gd

@@ -3,21 +3,39 @@ extends Node
 
 
 var current_scene = null
 var current_scene = null
 
 
+func _deferred_goto_scene(path):
 
 
-func goto_scene(scene):
-	#load new scene
-	var s = ResourceLoader.load(scene)
-	#queue erasing old (don't use free because that scene is calling this method)
-	current_scene.queue_free()
-	#instance the new scene
+	# Immediately free the current scene,
+        # there is no risk here.	
+	current_scene.free()
+
+	# Load new scene
+	var s = ResourceLoader.load(path)
+
+	# Instance the new scene
 	current_scene = s.instance()
 	current_scene = s.instance()
-	#add it to the active scene, as child of root
+
+	# Add it to the active scene, as child of root
 	get_tree().get_root().add_child(current_scene)
 	get_tree().get_root().add_child(current_scene)
 
 
+func goto_scene(path):
+
+	# This function will usually be called from a signal callback,
+        # or some other function from the running scene.
+	# Deleting the current scene at this point might be
+        # a bad idea, because it may be inside of a callback or function of it.
+	# The worst case will be a crash or unexpected behavior.
+
+	# The way around this is deferring the load to a later time, when
+        # it is ensured that no code from the current scene is running:
+
+	call_deferred("_deferred_goto_scene",path)
+
 
 
 func _ready():
 func _ready():
-	# get the current scene
+	# Get the current scene, the first time.
 	# it is always the last child of root,
 	# it is always the last child of root,
-	# after the autoloaded nodes
+	# after the autoloaded nodes.
+
 	var root = get_tree().get_root()
 	var root = get_tree().get_root()
 	current_scene = root.get_child( root.get_child_count() -1 )
 	current_scene = root.get_child( root.get_child_count() -1 )