Global state singleton

This commit is contained in:
MaddoScientisto 2025-02-20 21:26:51 +01:00
commit 52d5adebcb
7 changed files with 73 additions and 5 deletions

View file

@ -8,6 +8,7 @@ using Godot.Collections;
public partial class GameManager : Node2D
{
public static GameManager Instance { get; private set;}
private Hud _hud;
private PlayerMovement _player;
@ -30,6 +31,8 @@ public partial class GameManager : Node2D
private InventoryManager _inventoryManager { get; set; }
public MapStartData MapStartData { get; set; }
//private AlarmManager _alarmManager { get; set; }
//public InventoryManager Inventory => _inventoryManager;
@ -45,6 +48,8 @@ public partial class GameManager : Node2D
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
Instance = this;
_hud = GetNodeOrNull<Hud>("HUD");
if (_hud == null) GD.Print("No HUD in scene.");
@ -73,7 +78,7 @@ public partial class GameManager : Node2D
//_ = DelayPlayerSpawn();
CallDeferred(nameof(DelayPlayerSpawn));
CallDeferred(MethodName.DelayPlayerSpawn);
}
// Called every frame. 'delta' is the elapsed time since the previous frame.

57
Scripts/GlobalState.cs Normal file
View file

@ -0,0 +1,57 @@
using Godot;
public partial class GlobalState : Node
{
public static GlobalState Instance { get; private set; }
public Node CurrentScene { get; set; }
public override void _Ready()
{
Instance = this;
Viewport root = GetTree().Root;
// Using a negative index counts from the end, so this gets the last child node of `root`.
CurrentScene = root.GetChild(-1);
}
public void GotoScene(string path)
{
// This function will usually be called from a signal callback,
// or some other function from the current scene.
// Deleting the current scene at this point is
// a bad idea, because it may still be executing code.
// This will result in a crash or unexpected behavior.
// The solution is to defer the load to a later time, when
// we can be sure that no code from the current scene is running:
CallDeferred(MethodName.DeferredGotoScene, path);
}
public void DeferredGotoScene(string path)
{
// It is now safe to remove the current scene.
CurrentScene.Free();
// Load a new scene.
var nextScene = GD.Load<PackedScene>(path);
// Instance the new scene.
CurrentScene = nextScene.Instantiate();
// Add it to the active scene, as child of root.
GetTree().Root.AddChild(CurrentScene);
// Optionally, to make it compatible with the SceneTree.change_scene_to_file() API.
GetTree().CurrentScene = CurrentScene;
}
}
public class MapStartData
{
public int EggIndex = 0;
}

View file

@ -168,7 +168,9 @@ public partial class PlayerMovement : CharacterBody2D, IDestructible
_rightStickInput = Vector2.Zero;
_isStrafing = false;
_gameManager = this.GetGameManager();
_gameManager = GameManager.Instance;
//_gameManager = this.GetGameManager();
_inventoryManager = this.GetInventoryManager();
_gameManager.GameStateChange += GameManagerOnGameStateChange;

View file

@ -37,7 +37,8 @@ public partial class DebugMenu : Control
private void ButtonOnPressed(string scene)
{
GD.Print("Button was pressed, now what");
GetTree().ChangeSceneToFile(scene);
GlobalState.Instance.GotoScene(scene);
//GetTree().ChangeSceneToFile(scene);
}