blob: 8336a048f51f5d009c65e9df20a6abcad8147716 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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);
}
}
|