Add scene switcher for controlled scene switches
This commit is contained in:
		
							parent
							
								
									207629e014
								
							
						
					
					
						commit
						e5215356f3
					
				| @ -11,7 +11,7 @@ config_version=5 | ||||
| [application] | ||||
| 
 | ||||
| config/name="gmtk24" | ||||
| run/main_scene="res://scenes/demo/demo.tscn" | ||||
| run/main_scene="res://scenes/entrypoint_scene.tscn" | ||||
| config/features=PackedStringArray("4.3", "C#", "Forward Plus") | ||||
| config/icon="res://misc/icon.svg" | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										27
									
								
								scenes/entrypoint_scene.tscn
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								scenes/entrypoint_scene.tscn
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| [gd_scene load_steps=4 format=3 uid="uid://c5ksyousvxx7x"] | ||||
| 
 | ||||
| [ext_resource type="PackedScene" uid="uid://dv81sy34l8ice" path="res://scenes/stairs/stairs.tscn" id="1_00r22"] | ||||
| [ext_resource type="Script" path="res://scripts/SceneSwitcher.cs" id="1_ps0jf"] | ||||
| [ext_resource type="PackedScene" uid="uid://8po7ftboqq4k" path="res://scenes/demo/demo.tscn" id="2_rf0rf"] | ||||
| 
 | ||||
| [node name="EntrypointScene" type="Node" node_paths=PackedStringArray("LoadingScreen")] | ||||
| process_mode = 3 | ||||
| script = ExtResource("1_ps0jf") | ||||
| AddedLoadingScreenSeconds = 0.3 | ||||
| LoadingScreen = NodePath("LoadingScreen") | ||||
| DemoScene = ExtResource("2_rf0rf") | ||||
| StairsScene = ExtResource("1_00r22") | ||||
| 
 | ||||
| [node name="LoadingScreen" type="CenterContainer" parent="."] | ||||
| anchors_preset = 15 | ||||
| anchor_right = 1.0 | ||||
| anchor_bottom = 1.0 | ||||
| offset_left = 4.0 | ||||
| offset_right = 4.0 | ||||
| grow_horizontal = 2 | ||||
| grow_vertical = 2 | ||||
| 
 | ||||
| [node name="Label" type="Label" parent="LoadingScreen"] | ||||
| layout_mode = 2 | ||||
| theme_override_font_sizes/font_size = 36 | ||||
| text = "Loading..." | ||||
| @ -73,10 +73,9 @@ text = "Continue" | ||||
| custom_minimum_size = Vector2(340, 200) | ||||
| layout_mode = 2 | ||||
| theme_override_font_sizes/font_size = 11 | ||||
| current_tab = 3 | ||||
| current_tab = 0 | ||||
| 
 | ||||
| [node name="General settings" type="MarginContainer" parent="CenterContainer/HBoxContainer/OptionsAndButtonsContainer/MarginContainer/Options and buttons/TabContainer"] | ||||
| visible = false | ||||
| layout_mode = 2 | ||||
| theme_override_constants/margin_left = 10 | ||||
| theme_override_constants/margin_top = 10 | ||||
| @ -213,6 +212,7 @@ size_flags_horizontal = 3 | ||||
| action_mode = 0 | ||||
| 
 | ||||
| [node name="Graphics" type="MarginContainer" parent="CenterContainer/HBoxContainer/OptionsAndButtonsContainer/MarginContainer/Options and buttons/TabContainer"] | ||||
| visible = false | ||||
| layout_mode = 2 | ||||
| theme_override_constants/margin_left = 10 | ||||
| theme_override_constants/margin_top = 10 | ||||
|  | ||||
							
								
								
									
										103
									
								
								scripts/SceneSwitcher.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								scripts/SceneSwitcher.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | ||||
| using System.Threading; | ||||
| using Godot; | ||||
| 
 | ||||
| namespace Gmtk24 { | ||||
|     public partial class SceneSwitcher : Node { | ||||
|         public enum Scene { | ||||
|             Demo, | ||||
|             Stairs, | ||||
|         } | ||||
| 
 | ||||
|         /// <summary>This is the entrypoint of the godot project, and never gets | ||||
|         /// unloaded. Set when the entrypoint scene is loaded.</summary> | ||||
|         public static SceneSwitcher Singleton { get; private set; } | ||||
| 
 | ||||
|         [Export] | ||||
|         public float AddedLoadingScreenSeconds = 0.5f; | ||||
|         [Export] | ||||
|         public Control LoadingScreen; | ||||
|         [Export] | ||||
|         public PackedScene DemoScene; | ||||
|         [Export] | ||||
|         public PackedScene StairsScene; | ||||
| 
 | ||||
|         private PackedScene NextScene = null; | ||||
|         private Node InstantiatedScene = null; | ||||
|         private bool SceneLoaded = false; | ||||
|         /// <summary>The instantiation is deferred a bit to let the loading | ||||
|         /// screen actually render in case the loading takes more than a few | ||||
|         /// milliseconds.</summary> | ||||
|         private float SceneLoadCooldown = 0; | ||||
| 
 | ||||
|         public override void _Ready() { | ||||
|             Singleton = this; | ||||
|             SwitchToScene(Scene.Demo); | ||||
|         } | ||||
| 
 | ||||
|         public override void _UnhandledInput(InputEvent @event) { | ||||
|             if (@event is InputEventKey keyEv && keyEv.Pressed && keyEv.CtrlPressed) { | ||||
|                 if (keyEv.Keycode == Key.F1) { | ||||
|                     SwitchToScene(Scene.Demo); | ||||
|                     GetViewport().SetInputAsHandled(); | ||||
|                 } | ||||
|                 if (keyEv.Keycode == Key.F2) { | ||||
|                     SwitchToScene(Scene.Stairs); | ||||
|                     GetViewport().SetInputAsHandled(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public override void _Process(double delta) { | ||||
|             if (!SceneLoaded) { | ||||
|                 SceneLoadCooldown -= (float)delta; | ||||
|                 if (SceneLoadCooldown <= 0 && NextScene != null) { | ||||
|                     LoadNextScene(); | ||||
|                     NextScene = null; | ||||
|                     SceneLoaded = true; | ||||
|                     LoadingScreen.Visible = false; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void SwitchToScene(Scene newScene) { | ||||
|             PackedScene sceneToInstantiate = null; | ||||
|             switch (newScene) { | ||||
|                 case Scene.Demo: | ||||
|                     sceneToInstantiate = DemoScene; | ||||
|                     break; | ||||
|                 case Scene.Stairs: | ||||
|                     sceneToInstantiate = StairsScene; | ||||
|                     break; | ||||
|             } | ||||
|             if (sceneToInstantiate == null) { | ||||
|                 GD.PrintErr("Tried to switch scenes to Scene." + newScene + " but it hasn't been set up in the entrypoint scene!"); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             NextScene = sceneToInstantiate; | ||||
| 
 | ||||
|             if (IsInstanceValid(InstantiatedScene)) { | ||||
|                 RemoveChild(InstantiatedScene); | ||||
|                 InstantiatedScene.QueueFree(); | ||||
|             } | ||||
| 
 | ||||
|             LoadingScreen.Visible = true; | ||||
|             SceneLoadCooldown = AddedLoadingScreenSeconds; | ||||
|             SceneLoaded = false; | ||||
|         } | ||||
| 
 | ||||
|         private void LoadNextScene() { | ||||
|             if (NextScene == null) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             InstantiatedScene = NextScene.Instantiate(); | ||||
| 
 | ||||
|             if (InstantiatedScene.ProcessMode == ProcessModeEnum.Inherit) { | ||||
|                 InstantiatedScene.ProcessMode = ProcessModeEnum.Pausable; | ||||
|             } | ||||
|             AddChild(InstantiatedScene); | ||||
|             MoveChild(InstantiatedScene, 0); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user