Update README.md to include project description, developer documentation links, and license information.
CI / build-test (push) Successful in 1m6s
CI / build-test (push) Successful in 1m6s
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
using Friflo.Engine.ECS;
|
||||
using Friflo.Engine.ECS.Systems;
|
||||
|
||||
namespace MrGameEng.Core;
|
||||
|
||||
/// <summary>
|
||||
/// A scene owns its ECS world (<see cref="EntityStore"/>) and two system roots:
|
||||
/// <see cref="UpdateSystems"/> for game logic and <see cref="DrawSystems"/> for rendering.
|
||||
/// Override <see cref="OnLoad"/> to create entities and register systems.
|
||||
/// </summary>
|
||||
public abstract class Scene
|
||||
{
|
||||
/// <summary>The ECS world of this scene.</summary>
|
||||
public EntityStore Store { get; } = new();
|
||||
|
||||
/// <summary>Systems executed every update tick, in registration order.</summary>
|
||||
public SystemRoot UpdateSystems { get; }
|
||||
|
||||
/// <summary>Systems executed every draw tick, in registration order.</summary>
|
||||
public SystemRoot DrawSystems { get; }
|
||||
|
||||
/// <summary>Engine context. Valid from <see cref="OnLoad"/> until <see cref="OnUnload"/>.</summary>
|
||||
public EngineContext Context => _context ?? throw new InvalidOperationException("Scene is not loaded.");
|
||||
|
||||
/// <summary>True while the scene is the active, loaded scene.</summary>
|
||||
public bool IsLoaded => _context is not null;
|
||||
|
||||
private EngineContext? _context;
|
||||
|
||||
/// <summary>Initializes the scene's ECS world and system roots.</summary>
|
||||
protected Scene()
|
||||
{
|
||||
UpdateSystems = new SystemRoot(Store, "Update");
|
||||
DrawSystems = new SystemRoot(Store, "Draw");
|
||||
}
|
||||
|
||||
/// <summary>Called once when the scene becomes active: create entities, add systems.</summary>
|
||||
protected abstract void OnLoad();
|
||||
|
||||
/// <summary>Called once when the scene is replaced or the game exits. Release scene resources here.</summary>
|
||||
protected virtual void OnUnload() { }
|
||||
|
||||
/// <summary>Runs the update phase. Called by <see cref="SceneManager"/>.</summary>
|
||||
public virtual void Update(GameClock clock) =>
|
||||
UpdateSystems.Update(new UpdateTick(clock.DeltaTime, (float)clock.TotalTime));
|
||||
|
||||
/// <summary>Runs the draw phase. Called by <see cref="SceneManager"/>.</summary>
|
||||
public virtual void Draw(GameClock clock) =>
|
||||
DrawSystems.Update(new UpdateTick(clock.DeltaTime, (float)clock.TotalTime));
|
||||
|
||||
internal void Load(EngineContext context)
|
||||
{
|
||||
_context = context;
|
||||
OnLoad();
|
||||
}
|
||||
|
||||
internal void Unload()
|
||||
{
|
||||
OnUnload();
|
||||
_context = null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user