add: LoadingScene, ProxyNode
This commit is contained in:
6
src/Attributes/ProxyNode.cs
Normal file
6
src/Attributes/ProxyNode.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Polonium.Attributes;
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public class ProxyNode : Attribute
|
||||
{
|
||||
|
||||
}
|
||||
9
src/DataStructures/ProgressInfo.cs
Normal file
9
src/DataStructures/ProgressInfo.cs
Normal 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; }
|
||||
}
|
||||
29
src/Managers/LoaderManager.cs
Normal file
29
src/Managers/LoaderManager.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
30
src/Scenes/LoadingScene.cs
Normal file
30
src/Scenes/LoadingScene.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
using Godot;
|
||||
using Polonium.Attributes;
|
||||
|
||||
namespace Polonium.Scenes;
|
||||
[GlobalClass]
|
||||
[ProxyNode]
|
||||
public partial class RootScene : Node2D
|
||||
{
|
||||
private Scene CurrentScene { get; set; }
|
||||
|
||||
Reference in New Issue
Block a user