Add scene switcher for controlled scene switches
This commit is contained in:
		
							parent
							
								
									207629e014
								
							
						
					
					
						commit
						e5215356f3
					
				| @ -11,7 +11,7 @@ config_version=5 | |||||||
| [application] | [application] | ||||||
| 
 | 
 | ||||||
| config/name="gmtk24" | 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/features=PackedStringArray("4.3", "C#", "Forward Plus") | ||||||
| config/icon="res://misc/icon.svg" | 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) | custom_minimum_size = Vector2(340, 200) | ||||||
| layout_mode = 2 | layout_mode = 2 | ||||||
| theme_override_font_sizes/font_size = 11 | 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"] | [node name="General settings" type="MarginContainer" parent="CenterContainer/HBoxContainer/OptionsAndButtonsContainer/MarginContainer/Options and buttons/TabContainer"] | ||||||
| visible = false |  | ||||||
| layout_mode = 2 | layout_mode = 2 | ||||||
| theme_override_constants/margin_left = 10 | theme_override_constants/margin_left = 10 | ||||||
| theme_override_constants/margin_top = 10 | theme_override_constants/margin_top = 10 | ||||||
| @ -213,6 +212,7 @@ size_flags_horizontal = 3 | |||||||
| action_mode = 0 | action_mode = 0 | ||||||
| 
 | 
 | ||||||
| [node name="Graphics" type="MarginContainer" parent="CenterContainer/HBoxContainer/OptionsAndButtonsContainer/MarginContainer/Options and buttons/TabContainer"] | [node name="Graphics" type="MarginContainer" parent="CenterContainer/HBoxContainer/OptionsAndButtonsContainer/MarginContainer/Options and buttons/TabContainer"] | ||||||
|  | visible = false | ||||||
| layout_mode = 2 | layout_mode = 2 | ||||||
| theme_override_constants/margin_left = 10 | theme_override_constants/margin_left = 10 | ||||||
| theme_override_constants/margin_top = 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