GameTimer.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using Microsoft.Xna.Framework;
  3. namespace MonoGame.Extended.Timers
  4. {
  5. public abstract class GameTimer : IUpdateable
  6. {
  7. private bool _enabled;
  8. private int _updateOrder;
  9. /// <inheritdoc />
  10. public bool Enabled
  11. {
  12. get => _enabled;
  13. set
  14. {
  15. if (_enabled == value)
  16. {
  17. return;
  18. }
  19. _enabled = value;
  20. EnabledChanged?.Invoke(this, EventArgs.Empty);
  21. }
  22. }
  23. /// <inheritdoc />
  24. public int UpdateOrder
  25. {
  26. get => _updateOrder;
  27. set
  28. {
  29. if (_updateOrder == value)
  30. {
  31. return;
  32. }
  33. _updateOrder = value;
  34. EnabledChanged?.Invoke(this, EventArgs.Empty);
  35. }
  36. }
  37. /// <inheritdoc />
  38. public event EventHandler<EventArgs> EnabledChanged;
  39. /// <inheritdoc />
  40. public event EventHandler<EventArgs> UpdateOrderChanged;
  41. protected GameTimer(double intervalSeconds)
  42. : this(TimeSpan.FromSeconds(intervalSeconds))
  43. {
  44. }
  45. protected GameTimer(TimeSpan interval)
  46. {
  47. Interval = interval;
  48. Restart();
  49. }
  50. public TimeSpan Interval { get; set; }
  51. public TimeSpan CurrentTime { get; protected set; }
  52. public TimerState State { get; protected set; }
  53. public void Update(GameTime gameTime)
  54. {
  55. if (State != TimerState.Started)
  56. return;
  57. CurrentTime += gameTime.ElapsedGameTime;
  58. OnUpdate(gameTime);
  59. }
  60. public event EventHandler Started;
  61. public event EventHandler Stopped;
  62. public event EventHandler Paused;
  63. public void Start()
  64. {
  65. State = TimerState.Started;
  66. Started?.Invoke(this, EventArgs.Empty);
  67. }
  68. public void Stop()
  69. {
  70. State = TimerState.Stopped;
  71. CurrentTime = TimeSpan.Zero;
  72. OnStopped();
  73. Stopped?.Invoke(this, EventArgs.Empty);
  74. }
  75. public void Restart()
  76. {
  77. Stop();
  78. Start();
  79. }
  80. public void Pause()
  81. {
  82. State = TimerState.Paused;
  83. Paused?.Invoke(this, EventArgs.Empty);
  84. }
  85. protected abstract void OnStopped();
  86. protected abstract void OnUpdate(GameTime gameTime);
  87. }
  88. }