BaseGame with fixed timestep.
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using System.Diagnostics;
|
||||
using Voile.Input;
|
||||
using Voile.Rendering;
|
||||
using Voile.Resources;
|
||||
@@ -83,7 +84,6 @@ namespace Voile
|
||||
}
|
||||
|
||||
Initialize();
|
||||
LoadResources();
|
||||
Ready();
|
||||
Run();
|
||||
Shutdown();
|
||||
@@ -116,10 +116,6 @@ namespace Voile
|
||||
/// </summary>
|
||||
public abstract void Initialize();
|
||||
/// <summary>
|
||||
/// Called when it's time to load the game's resources, such as images or sounds.
|
||||
/// </summary>
|
||||
protected abstract void LoadResources();
|
||||
/// <summary>
|
||||
/// Called when it's safe to manipulate the resources or/and systems.
|
||||
/// You can safely create game objects, scenes, etc. in this method.
|
||||
/// </summary>
|
||||
@@ -143,4 +139,63 @@ namespace Voile
|
||||
Renderer.Start(RendererSettings.Default);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class BaseGame : Game
|
||||
{
|
||||
public double UpdateTimeStep { get; set; } = 1.0 / 60.0;
|
||||
public TimeSpan UpdateFrameTime { get; private set; }
|
||||
public TimeSpan RenderFrameTime { get; private set; }
|
||||
public override void Initialize()
|
||||
{
|
||||
LoadResources();
|
||||
InitializeDefault();
|
||||
}
|
||||
|
||||
public override void Shutdown() => ShutdownDefault();
|
||||
|
||||
/// <summary>
|
||||
/// Called when it's time to load the game's resources, such as images or sounds.
|
||||
/// </summary>
|
||||
protected abstract void LoadResources();
|
||||
|
||||
protected override void Run()
|
||||
{
|
||||
Stopwatch stopwatch = Stopwatch.StartNew();
|
||||
double previousTime = stopwatch.Elapsed.TotalSeconds;
|
||||
|
||||
while (Renderer.ShouldRun)
|
||||
{
|
||||
double currentTime = stopwatch.Elapsed.TotalSeconds;
|
||||
double elapsedTime = currentTime - previousTime;
|
||||
previousTime = currentTime;
|
||||
|
||||
_accumulator += elapsedTime;
|
||||
|
||||
while (_accumulator >= UpdateTimeStep)
|
||||
{
|
||||
Update(UpdateTimeStep);
|
||||
_accumulator -= UpdateTimeStep;
|
||||
}
|
||||
|
||||
Renderer.BeginFrame();
|
||||
Render(Renderer.FrameTime);
|
||||
Renderer.EndFrame();
|
||||
|
||||
RenderFrameTime = TimeSpan.FromSeconds(Renderer.FrameTime);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Triggered on each fixed timestep. Update your game's state here.
|
||||
/// </summary>
|
||||
/// <param name="deltaTime"></param>
|
||||
protected abstract void Update(double deltaTime);
|
||||
/// <summary>
|
||||
/// Triggered when the renderer is ready to render the next frame.
|
||||
/// </summary>
|
||||
/// <param name="deltaTime"></param>
|
||||
protected abstract void Render(double deltaTime);
|
||||
|
||||
private double _accumulator;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user