summaryrefslogtreecommitdiff
path: root/Plugins/MonoGame.Extended/source/MonoGame.Extended/Screens/Transitions/Transition.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2024-06-03 10:15:45 +0800
committerchai <215380520@qq.com>2024-06-03 10:15:45 +0800
commitacea7b2e728787a0d83bbf83c8c1f042d2c32e7e (patch)
tree0bfec05c1ca2d71be2c337bcd110a0421f19318b /Plugins/MonoGame.Extended/source/MonoGame.Extended/Screens/Transitions/Transition.cs
parent88febcb02bf127d961c6471d9e846c0e1315f5c3 (diff)
+ plugins project
Diffstat (limited to 'Plugins/MonoGame.Extended/source/MonoGame.Extended/Screens/Transitions/Transition.cs')
-rw-r--r--Plugins/MonoGame.Extended/source/MonoGame.Extended/Screens/Transitions/Transition.cs58
1 files changed, 58 insertions, 0 deletions
diff --git a/Plugins/MonoGame.Extended/source/MonoGame.Extended/Screens/Transitions/Transition.cs b/Plugins/MonoGame.Extended/source/MonoGame.Extended/Screens/Transitions/Transition.cs
new file mode 100644
index 0000000..8336a04
--- /dev/null
+++ b/Plugins/MonoGame.Extended/source/MonoGame.Extended/Screens/Transitions/Transition.cs
@@ -0,0 +1,58 @@
+using System;
+using Microsoft.Xna.Framework;
+
+namespace MonoGame.Extended.Screens.Transitions
+{
+ public enum TransitionState { In, Out }
+
+ public abstract class Transition : IDisposable
+ {
+ private readonly float _halfDuration;
+ private float _currentSeconds;
+
+ protected Transition(float duration)
+ {
+ Duration = duration;
+ _halfDuration = Duration / 2f;
+ }
+
+ public abstract void Dispose();
+
+ public TransitionState State { get; private set; } = TransitionState.Out;
+ public float Duration { get; }
+ public float Value => MathHelper.Clamp(_currentSeconds / _halfDuration, 0f, 1f);
+
+ public event EventHandler StateChanged;
+ public event EventHandler Completed;
+
+ public void Update(GameTime gameTime)
+ {
+ var elapsedSeconds = gameTime.GetElapsedSeconds();
+
+ switch (State)
+ {
+ case TransitionState.Out:
+ _currentSeconds += elapsedSeconds;
+
+ if (_currentSeconds >= _halfDuration)
+ {
+ State = TransitionState.In;
+ StateChanged?.Invoke(this, EventArgs.Empty);
+ }
+ break;
+ case TransitionState.In:
+ _currentSeconds -= elapsedSeconds;
+
+ if (_currentSeconds <= 0.0f)
+ {
+ Completed?.Invoke(this, EventArgs.Empty);
+ }
+ break;
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+ }
+
+ public abstract void Draw(GameTime gameTime);
+ }
+} \ No newline at end of file