Files
Syntriax.Engine/Engine.Systems/Tween/TweenExtensions.cs

105 lines
2.9 KiB
C#

using System;
namespace Engine.Systems.Tween;
public static class TweenExtensions
{
private static readonly System.Collections.Generic.Dictionary<ITween, int> loopDictionary = [];
public static ITween Loop(this ITween tween, int count)
{
if (!loopDictionary.TryAdd(tween, count))
throw new($"Tween already has a loop in progress.");
tween.OnCompleted.AddListener(looperDelegate);
tween.OnEnded.AddListener(looperEndDelegate);
return tween;
}
private static readonly Core.Event<ITween>.EventHandler looperEndDelegate = sender => loopDictionary.Remove(sender);
private static readonly Core.Event<ITween>.EventHandler looperDelegate = sender =>
{
int counter = loopDictionary[sender] = loopDictionary[sender] - 1;
if (counter <= 0)
{
loopDictionary.Remove(sender);
return;
}
Tween tweenConcrete = (Tween)sender;
tweenConcrete.Reset();
tweenConcrete.State = TweenState.Playing;
};
public static ITween LoopInfinitely(this ITween tween)
{
tween.OnCompleted.AddListener(repeaterDelegate);
return tween;
}
private static readonly Core.Event<ITween>.EventHandler repeaterDelegate = sender =>
{
Tween tweenConcrete = (Tween)sender;
tweenConcrete.Reset();
tweenConcrete.State = TweenState.Playing;
};
public static ITween Ease(this ITween tween, IEasing easing)
{
Tween tweenConcrete = (Tween)tween;
tweenConcrete.Easing = easing;
return tween;
}
public static ITween OnStart(this ITween tween, Action callback)
{
tween.OnStarted.AddListener(_ => callback.Invoke());
return tween;
}
public static ITween OnPause(this ITween tween, Action callback)
{
tween.OnPaused.AddListener(_ => callback.Invoke());
return tween;
}
public static ITween OnResume(this ITween tween, Action callback)
{
tween.OnResumed.AddListener(_ => callback.Invoke());
return tween;
}
public static ITween OnCancel(this ITween tween, Action callback)
{
tween.OnCancelled.AddListener(_ => callback.Invoke());
return tween;
}
public static ITween OnComplete(this ITween tween, Action callback)
{
tween.OnCompleted.AddListener(_ => callback.Invoke());
return tween;
}
public static ITween OnEnd(this ITween tween, Action callback)
{
tween.OnEnded.AddListener(_ => callback.Invoke());
return tween;
}
public static ITween OnUpdate(this ITween tween, Action callback)
{
tween.OnUpdated.AddListener(_ => callback.Invoke());
return tween;
}
public static ITween OnDeltaUpdate(this ITween tween, Action<float> callback)
{
tween.OnDeltaUpdated.AddListener((_, arguments) => callback.Invoke(arguments.Delta));
return tween;
}
}