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