diff options
author | chai <215380520@qq.com> | 2024-06-03 10:15:45 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2024-06-03 10:15:45 +0800 |
commit | acea7b2e728787a0d83bbf83c8c1f042d2c32e7e (patch) | |
tree | 0bfec05c1ca2d71be2c337bcd110a0421f19318b /Plugins/MonoGame.Extended/source/MonoGame.Extended/Screens/Transitions/Transition.cs | |
parent | 88febcb02bf127d961c6471d9e846c0e1315f5c3 (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.cs | 58 |
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 |