diff --git a/Engine.Core/Abstract/IGameManager.cs b/Engine.Core/Abstract/IGameManager.cs index 96e0377..19b52f7 100644 --- a/Engine.Core/Abstract/IGameManager.cs +++ b/Engine.Core/Abstract/IGameManager.cs @@ -32,11 +32,21 @@ public interface IGameManager : IEntity, IEnumerable /// event HierarchyObjectUnRegisteredEventHandler? OnHierarchyObjectUnRegistered; + /// + /// Current time scale the operates on. + /// + float TimeScale { get; set; } + /// /// Contains time data related to this . /// EngineTime Time { get; } + /// + /// Contains unscaled time data related to this . + /// + EngineTime UnscaledTime { get; } + /// /// Gets a read-only list of s managed by the . /// diff --git a/Engine.Core/GameManager.cs b/Engine.Core/GameManager.cs index d86e993..bc7dc84 100644 --- a/Engine.Core/GameManager.cs +++ b/Engine.Core/GameManager.cs @@ -18,6 +18,7 @@ public class GameManager : BaseEntity, IGameManager public event IGameManager.HierarchyObjectUnRegisteredEventHandler? OnHierarchyObjectUnRegistered = null; private readonly List _hierarchyObjects = new(Constants.GAME_OBJECTS_SIZE_INITIAL); + private float _timeScale = 1f; public IReadOnlyList HierarchyObjects => _hierarchyObjects; @@ -37,6 +38,12 @@ public class GameManager : BaseEntity, IGameManager } public EngineTime Time { get; private set; } = new(); + public EngineTime UnscaledTime { get; private set; } = new(); + public float TimeScale + { + get => _timeScale; + set => _timeScale = value.Max(0f); + } public void Register(IHierarchyObject hierarchyObject) { @@ -113,14 +120,15 @@ public class GameManager : BaseEntity, IGameManager public void Update(EngineTime engineTime) { - Time = engineTime; + UnscaledTime = engineTime; + Time = new(TimeSpan.FromTicks((long)(Time.TimeSinceStart.Ticks + engineTime.DeltaSpan.Ticks * TimeScale)), TimeSpan.FromTicks((long)(engineTime.DeltaSpan.Ticks * TimeScale))); - OnPreUpdate?.Invoke(this, engineTime); + OnPreUpdate?.Invoke(this, Time); for (int i = 0; i < HierarchyObjects.Count; i++) HierarchyObjects[i].BehaviourController.Update(); - OnUpdate?.Invoke(this, engineTime); + OnUpdate?.Invoke(this, Time); } public void PreDraw()