diff --git a/src/cs/MonoGame.Extended.Tweening/ColorTween.cs b/src/cs/MonoGame.Extended.Tweening/ColorTween.cs new file mode 100644 index 00000000..2e98e5d1 --- /dev/null +++ b/src/cs/MonoGame.Extended.Tweening/ColorTween.cs @@ -0,0 +1,15 @@ +using Microsoft.Xna.Framework; + +namespace MonoGame.Extended.Tweening; + +public class ColorTween: Tween +{ + internal ColorTween(object target, float duration, float delay, TweenMember member, Color endValue) : base(target, duration, delay, member, endValue) + { + } + + protected override void Interpolate(float n) + { + Member.Value = Color.Lerp(_startValue, _endValue, n); + } +} diff --git a/src/cs/MonoGame.Extended.Tweening/LinearOperations.cs b/src/cs/MonoGame.Extended.Tweening/LinearOperations.cs new file mode 100644 index 00000000..12a03a8e --- /dev/null +++ b/src/cs/MonoGame.Extended.Tweening/LinearOperations.cs @@ -0,0 +1,21 @@ +using System; +using System.Linq.Expressions; + +namespace MonoGame.Extended.Tweening; + +public class LinearOperations +{ + static LinearOperations() + { + var a = Expression.Parameter(typeof(T)); + var b = Expression.Parameter(typeof(T)); + var c = Expression.Parameter(typeof(float)); + Add = Expression.Lambda>(Expression.Add(a, b), a, b).Compile(); + Subtract = Expression.Lambda>(Expression.Subtract(a, b), a, b).Compile(); + Multiply = Expression.Lambda>(Expression.Multiply(a, c), a, c).Compile(); + } + + public static Func Add { get; } + public static Func Subtract { get; } + public static Func Multiply { get; } +} diff --git a/src/cs/MonoGame.Extended.Tweening/LinearTween.cs b/src/cs/MonoGame.Extended.Tweening/LinearTween.cs new file mode 100644 index 00000000..8469a135 --- /dev/null +++ b/src/cs/MonoGame.Extended.Tweening/LinearTween.cs @@ -0,0 +1,23 @@ +namespace MonoGame.Extended.Tweening; + +public class LinearTween: Tween + where T: struct +{ + private T _range; + + internal LinearTween(object target, float duration, float delay, TweenMember member, T endValue) : base(target, duration, delay, member, endValue) + { + } + + protected override void Initialize() + { + base.Initialize(); + _range = LinearOperations.Subtract(_endValue, _startValue); + } + + protected override void Interpolate(float n) + { + var value = LinearOperations.Add(_startValue, LinearOperations.Multiply(_range, n)); + Member.Value = value; + } +} diff --git a/src/cs/MonoGame.Extended.Tweening/Tween.cs b/src/cs/MonoGame.Extended.Tweening/Tween.cs index b15a30ee..ad292518 100644 --- a/src/cs/MonoGame.Extended.Tweening/Tween.cs +++ b/src/cs/MonoGame.Extended.Tweening/Tween.cs @@ -3,10 +3,10 @@ using Microsoft.Xna.Framework; namespace MonoGame.Extended.Tweening { - public class Tween : Tween - where T : struct + public abstract class Tween : Tween + where T : struct { - internal Tween(object target, float duration, float delay, TweenMember member, T endValue) + internal Tween(object target, float duration, float delay, TweenMember member, T endValue) : base(target, duration, delay) { Member = member; @@ -16,20 +16,12 @@ namespace MonoGame.Extended.Tweening public TweenMember Member { get; } public override string MemberName => Member.Name; - private T _startValue; - private T _endValue; - private T _range; + protected T _startValue; + protected T _endValue; protected override void Initialize() { _startValue = Member.Value; - _range = TweenMember.Subtract(_endValue, _startValue); - } - - protected override void Interpolate(float n) - { - var value = TweenMember.Add(_startValue, TweenMember.Multiply(_range, n)); - Member.Value = value; } protected override void Swap() @@ -189,4 +181,4 @@ namespace MonoGame.Extended.Tweening } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tweening/TweenMember.cs b/src/cs/MonoGame.Extended.Tweening/TweenMember.cs index 59414e17..adcee598 100644 --- a/src/cs/MonoGame.Extended.Tweening/TweenMember.cs +++ b/src/cs/MonoGame.Extended.Tweening/TweenMember.cs @@ -16,29 +16,15 @@ namespace MonoGame.Extended.Tweening } public abstract class TweenMember : TweenMember - where T : struct + where T : struct { - static TweenMember() - { - var a = Expression.Parameter(typeof(T)); - var b = Expression.Parameter(typeof(T)); - var c = Expression.Parameter(typeof(float)); - Add = Expression.Lambda>(Expression.Add(a, b), a, b).Compile(); - Subtract = Expression.Lambda>(Expression.Subtract(a, b), a, b).Compile(); - Multiply = Expression.Lambda>(Expression.Multiply(a, c), a, c).Compile(); - } - - public static Func Add { get; } - public static Func Subtract { get; } - public static Func Multiply { get; } - protected TweenMember(object target, Func getMethod, Action setMethod) : base(target) { _getMethod = getMethod; - _setMethod = setMethod; + _setMethod = setMethod; } - + private readonly Func _getMethod; private readonly Action _setMethod; @@ -48,4 +34,4 @@ namespace MonoGame.Extended.Tweening set { _setMethod(Target, value); } } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tweening/Tweener.cs b/src/cs/MonoGame.Extended.Tweening/Tweener.cs index 12895cea..1e17efae 100644 --- a/src/cs/MonoGame.Extended.Tweening/Tweener.cs +++ b/src/cs/MonoGame.Extended.Tweening/Tweener.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; +using Microsoft.Xna.Framework; namespace MonoGame.Extended.Tweening { @@ -26,6 +27,21 @@ namespace MonoGame.Extended.Tweening public Tween TweenTo(TTarget target, Expression> expression, TMember toValue, float duration, float delay = 0f) where TTarget : class where TMember : struct + { + switch (toValue) + { + case Color toValueColor: + return (Tween)(object)TweenTo(target, expression as Expression>, toValueColor, duration, delay); + default: + return TweenTo>(target, expression, toValue, duration, delay); + } + + } + + public Tween TweenTo(TTarget target, Expression> expression, TMember toValue, float duration, float delay = 0f) + where TTarget : class + where TMember : struct + where TTween : Tween { var memberExpression = (MemberExpression)expression.Body; var memberInfo = memberExpression.Member; @@ -35,7 +51,7 @@ namespace MonoGame.Extended.Tweening activeTween?.Cancel(); AllocationCount++; - var tween = new Tween(target, duration, delay, member, toValue); + var tween = (TTween)Activator.CreateInstance(typeof(TTween), target, duration, delay, member, toValue); _activeTweens.Add(tween); return tween; } @@ -112,4 +128,4 @@ namespace MonoGame.Extended.Tweening throw new InvalidOperationException($"'{memberName}' is not a property or field of the target"); } } -} \ No newline at end of file +}