67 lines
1.8 KiB
C#
67 lines
1.8 KiB
C#
using System.Collections;
|
|
|
|
using Syntriax.Engine.Core;
|
|
using Syntriax.Engine.Core.Abstract;
|
|
|
|
namespace Syntriax.Engine.Systems.Tween;
|
|
|
|
public class TweenManager : UniverseObject
|
|
{
|
|
private CoroutineManager coroutineManager = null!;
|
|
|
|
private readonly Dictionary<ITween, IEnumerator> runningCoroutines = [];
|
|
|
|
public ITween StartTween(float duration, TweenSetCallback? setCallback = null)
|
|
{
|
|
Tween tween = new(duration);
|
|
tween.OnUpdated += tween => setCallback?.InvokeSafe(tween.Value);
|
|
runningCoroutines.Add(tween, coroutineManager.StartCoroutine(RunTween(tween)));
|
|
return tween;
|
|
}
|
|
|
|
private IEnumerator RunTween(Tween tween)
|
|
{
|
|
tween.State = TweenState.Playing;
|
|
yield return null;
|
|
|
|
while (true)
|
|
{
|
|
if (tween.State.CheckFlag(TweenState.Cancelled | TweenState.Completed))
|
|
break;
|
|
|
|
if (tween.State.CheckFlag(TweenState.Paused))
|
|
{
|
|
yield return null;
|
|
continue;
|
|
}
|
|
|
|
tween.Counter += Universe.Time.DeltaTime;
|
|
yield return null;
|
|
}
|
|
|
|
runningCoroutines.Remove(tween);
|
|
}
|
|
|
|
public void CancelTween(ITween tween)
|
|
{
|
|
if (!runningCoroutines.TryGetValue(tween, out IEnumerator? runningCoroutine))
|
|
return;
|
|
|
|
tween.State = TweenState.Cancelled;
|
|
coroutineManager.StopCoroutine(runningCoroutine);
|
|
runningCoroutines.Remove(tween);
|
|
}
|
|
|
|
protected override void OnEnteringUniverse(IUniverse universe)
|
|
{
|
|
coroutineManager = universe.GetRequiredUniverseObject<CoroutineManager>();
|
|
}
|
|
|
|
protected override void OnExitingUniverse(IUniverse universe)
|
|
{
|
|
coroutineManager = null!;
|
|
}
|
|
|
|
public delegate void TweenSetCallback(float t);
|
|
}
|