add: LoadingScene, ProxyNode

This commit is contained in:
h z
2025-02-09 01:07:12 +00:00
parent 15c667c3c4
commit 0a8b275176
10 changed files with 85 additions and 23 deletions

View File

@@ -0,0 +1,6 @@
namespace Polonium.Attributes;
[AttributeUsage(AttributeTargets.Class)]
public class ProxyNode : Attribute
{
}

View File

@@ -0,0 +1,9 @@
namespace Polonium.DataStructures;
public abstract class ProgressInfo
{
public int CurrentTaskIndex { get; set; }
public int TotalTasks { get; set; }
public abstract float Progress { get; }
public string Message { get; set; }
}

View File

@@ -0,0 +1,29 @@
using Polonium.DataStructures;
namespace Polonium.Managers;
public abstract class LoaderManager<T>
where T : ProgressInfo
{
public bool Started { get; private set; } = false;
public bool Finished { get; protected set; } = false;
public void Start()
{
if(Started)
throw new InvalidOperationException("Loader is already started");
Started = true;
Thread load = new Thread(LoadTask);
load.Start();
}
public abstract T QueryProgress();
public abstract void Load();
public void LoadTask()
{
Load();
Finished = true;
}
}

View File

@@ -1,8 +1,8 @@
using Godot;
using Polonium.Attributes;
namespace Polonium.Scenes;
[GlobalClass]
[Tool]
[ProxyNode]
public partial class CameraScene : Scene
{
private Camera2D Camera { get; set; }
@@ -20,8 +20,7 @@ public partial class CameraScene : Scene
}
public override void _Ready()
{
Camera = new Camera2D();
AddChild(Camera);
Camera = GetNode<Camera2D>("Camera");
base._Ready();
}
protected void ZoomIn() => Zoom = Mathf.Max(Zoom * (1 + ZoomRate), MaxZoom);

View File

@@ -1,14 +0,0 @@
using Godot;
namespace Polonium.Scenes;
[GlobalClass]
public partial class LayerCameraScene : CameraScene
{
private Node2D LayerHolder { get; set; }
public override void _Ready()
{
LayerHolder = new Node2D();
base._Ready();
}
}

View File

@@ -0,0 +1,30 @@
using Godot;
using Polonium.DataStructures;
using Polonium.Managers;
namespace Polonium.Scenes;
public abstract partial class LoadingScene<T> : Scene
where T : ProgressInfo
{
public Scene AfterLoaded { get; set; }
private double CoolDown { get; set; } = 0;
public LoaderManager<T> Manager { get; set; }
protected abstract void ConsumeProgressInfo(T progressInfo);
public override void _Process(double delta)
{
CoolDown += delta;
if (CoolDown < 1)
return;
CoolDown = 0;
T progress = Manager.QueryProgress();
ConsumeProgressInfo(progress);
if(Manager.Finished)
PoloniumRegistry.Instance.RootScene.SwitchScene(AfterLoaded);
base._Process(delta);
}
}

View File

@@ -1,6 +1,8 @@
using Godot;
using Polonium.Attributes;
namespace Polonium.Scenes;
[GlobalClass]
[ProxyNode]
public partial class RootScene : Node2D
{
private Scene CurrentScene { get; set; }