using System; using Microsoft.Xna.Framework; namespace MonoGame.Extended.Tweening { public static class FluentTweening { internal static TweeningComponent TweeningComponent { get; set; } public static TweenGroup CreateTweenGroup(this T target, Action onCompleteAction = null, bool disposeOnComplete = true) where T : class { var tweenGroup = new TweenGroup(target, onCompleteAction, disposeOnComplete); TweeningComponent.AddTween(tweenGroup); return tweenGroup; } public static TweenChain CreateTweenChain(this T target, Action onCompleteAction = null, bool disposeOnComplete = true) { var tweenGroup = new TweenChain(target, onCompleteAction, disposeOnComplete); TweeningComponent.AddTween(tweenGroup); return tweenGroup; } public static TweenAnimation MoveTo(this TweenAnimation tweenAnimation, Vector2 position, float duration, EasingFunction easingFunction) where T : IMovable { var movable = tweenAnimation.Target; tweenAnimation.Tweens.Add(new PropertyTween(() => movable.Position, v => movable.Position = v, position, duration, easingFunction)); return tweenAnimation; } public static TweenAnimation Move(this TweenAnimation tweenAnimation, Vector2 direction, float duration, EasingFunction easingFunction) where T : IMovable { var movable = tweenAnimation.Target; return MoveTo(tweenAnimation, movable.Position + direction, duration, easingFunction); } public static TweenAnimation RotateTo(this TweenAnimation tweenAnimation, float radians, float duration, EasingFunction easingFunction) where T : IRotatable { var rotatable = tweenAnimation.Target; tweenAnimation.Tweens.Add(new PropertyTween(() => rotatable.Rotation, v => rotatable.Rotation = v, radians, duration, easingFunction)); return tweenAnimation; } public static TweenAnimation Rotate(this TweenAnimation tweenAnimation, float radians, float duration, EasingFunction easingFunction) where T : IRotatable { var rotatable = tweenAnimation.Target; return RotateTo(tweenAnimation, rotatable.Rotation + radians, duration, easingFunction); } public static TweenAnimation ScaleTo(this TweenAnimation tweenAnimation, Vector2 scale, float duration, EasingFunction easingFunction) where T : IScalable { var scalable = tweenAnimation.Target; tweenAnimation.Tweens.Add(new PropertyTween(() => scalable.Scale, v => scalable.Scale = v, scale, duration, easingFunction)); return tweenAnimation; } public static TweenAnimation Scale(this TweenAnimation tweenAnimation, Vector2 scale, float duration, EasingFunction easingFunction) where T : IScalable { var scalable = tweenAnimation.Target; return ScaleTo(tweenAnimation, scalable.Scale*scale, duration, easingFunction); } public static TweenAnimation Delay(this TweenAnimation tweenAnimation, float duration) { tweenAnimation.Tweens.Add(new DelayTween(duration)); return tweenAnimation; } public static TweenAnimation FadeTo(this TweenAnimation tweenAnimation, float alpha, float duration, EasingFunction easingFunction) where T : IColorable { var colorable = tweenAnimation.Target; var initialColor = colorable.Color; tweenAnimation.Tweens.Add(new PropertyTween(() => initialColor.A/255f, a => colorable.Color = initialColor*a, alpha, duration, easingFunction)); return tweenAnimation; } } }