using System; using Microsoft.Xna.Framework; namespace MonoGame.Extended.Timers { public abstract class GameTimer : IUpdateable { private bool _enabled; private int _updateOrder; /// public bool Enabled { get => _enabled; set { if (_enabled == value) { return; } _enabled = value; EnabledChanged?.Invoke(this, EventArgs.Empty); } } /// public int UpdateOrder { get => _updateOrder; set { if (_updateOrder == value) { return; } _updateOrder = value; EnabledChanged?.Invoke(this, EventArgs.Empty); } } /// public event EventHandler EnabledChanged; /// public event EventHandler UpdateOrderChanged; protected GameTimer(double intervalSeconds) : this(TimeSpan.FromSeconds(intervalSeconds)) { } protected GameTimer(TimeSpan interval) { Interval = interval; Restart(); } public TimeSpan Interval { get; set; } public TimeSpan CurrentTime { get; protected set; } public TimerState State { get; protected set; } public void Update(GameTime gameTime) { if (State != TimerState.Started) return; CurrentTime += gameTime.ElapsedGameTime; OnUpdate(gameTime); } public event EventHandler Started; public event EventHandler Stopped; public event EventHandler Paused; public void Start() { State = TimerState.Started; Started?.Invoke(this, EventArgs.Empty); } public void Stop() { State = TimerState.Stopped; CurrentTime = TimeSpan.Zero; OnStopped(); Stopped?.Invoke(this, EventArgs.Empty); } public void Restart() { Stop(); Start(); } public void Pause() { State = TimerState.Paused; Paused?.Invoke(this, EventArgs.Empty); } protected abstract void OnStopped(); protected abstract void OnUpdate(GameTime gameTime); } }