public void Add <TProperty>(Action <T, TProperty> setter, IAnimation <TProperty> animation)
        {
            var transitions = new List <AnimationTransition <T> >();

            foreach (AnimationTransition <TProperty> propertyTransition in animation)
            {
                var transition = new AnimationTransition <T>
                {
                    Begin  = propertyTransition.Begin,
                    End    = propertyTransition.End,
                    Action = (ref T animatable, float advance) =>
                    {
                        TProperty property = default(TProperty);
                        propertyTransition.Action?.Invoke(ref property, advance);
                        setter(animatable, property);
                    }
                };

                transitions.Add(transition);
            }

            if (animation.Loop)
            {
                _loopedTransitions.Add(new LoopedAnimationTransition(transitions));
            }
            else
            {
                _transitions.AddRange(transitions);

                if (animation.Duration > _linearDuration)
                {
                    _linearDuration = animation.Duration;
                }
            }
        }
示例#2
0
        public AnimationTransitionDelegate <T> this[float begin, float end]
        {
            set
            {
                var step = new AnimationTransition <T>
                {
                    Begin  = begin,
                    End    = end,
                    Action = value
                };

                _list.Add(step);
            }
        }
        public IAnimation <T> Create()
        {
            float loopDuration   = GetLeastCommonMultiple(_loopedTransitions.Select(x => x.Duration).ToArray());
            float linearDuration = _transitions.Any() ? _transitions.Max(x => x.End) : 0;

            float duration;

            if (loopDuration.EqualsZero())
            {
                duration = linearDuration;
            }
            else
            {
                duration = loopDuration;
                while (duration < linearDuration)
                {
                    duration += loopDuration;
                }
            }

            foreach (LoopedAnimationTransition loopedAnimationTransition in _loopedTransitions)
            {
                for (float i = 0; i < duration; i += loopedAnimationTransition.Duration)
                {
                    foreach (AnimationTransition <T> animationTransition in loopedAnimationTransition.Transitions)
                    {
                        var transition = new AnimationTransition <T>
                        {
                            Begin  = animationTransition.Begin + i,
                            End    = animationTransition.End + i,
                            Action = animationTransition.Action
                        };
                        _transitions.Add(transition);
                    }

                    if (loopedAnimationTransition.Duration.EqualsZero())
                    {
                        break;
                    }
                }
            }

            var animation = new Animation <T>(_transitions)
            {
                Loop = Loop
            };

            return(animation);
        }
示例#4
0
 public int CompareTo(AnimationTransition <T> other)
 {
     return(Begin.CompareTo(other.Begin));
 }