コード例 #1
0
        private static float ApplySpeedCurve(SpriterKey key, float factor)
        {
            switch (key.CurveType)
            {
            case SpriterCurveType.Instant:
                factor = 0.0f;
                break;

            case SpriterCurveType.Linear:
                break;

            case SpriterCurveType.Quadratic:
                factor = MathHelper.Curve(factor, 0.0f, key.C1, 1.0f);
                break;

            case SpriterCurveType.Cubic:
                factor = MathHelper.Curve(factor, 0.0f, key.C1, key.C2, 1.0f);
                break;

            case SpriterCurveType.Quartic:
                factor = MathHelper.Curve(factor, 0.0f, key.C1, key.C2, key.C3, 1.0f);
                break;

            case SpriterCurveType.Quintic:
                factor = MathHelper.Curve(factor, 0.0f, key.C1, key.C2, key.C3, key.C4, 1.0f);
                break;

            case SpriterCurveType.Bezier:
                factor = MathHelper.Bezier(key.C1, key.C2, key.C3, key.C4, factor);
                break;
            }

            return(factor);
        }
コード例 #2
0
        private static float AdjustTime(SpriterKey keyA, SpriterKey keyB, float animationLength, float targetTime)
        {
            float nextTime = keyB.Time > keyA.Time ? keyB.Time : animationLength;
            float factor   = GetFactor(keyA, keyB, animationLength, targetTime);

            return(MathHelper.Linear(keyA.Time, nextTime, factor));
        }
コード例 #3
0
        private static float ApplySpeedCurve(SpriterKey key, float factor)
        {
            switch (key.CurveType)
            {
                case SpriterCurveType.Instant:
                    factor = 0.0f;
                    break;
                case SpriterCurveType.Linear:
                    break;
                case SpriterCurveType.Quadratic:
                    factor = Bezier(factor, 0.0f, key.C1, 1.0f);
                    break;
                case SpriterCurveType.Cubic:
                    factor = Bezier(factor, 0.0f, key.C1, key.C2, 1.0f);
                    break;
                case SpriterCurveType.Quartic:
                    factor = Bezier(factor, 0.0f, key.C1, key.C2, key.C3, 1.0f);
                    break;
                case SpriterCurveType.Quintic:
                    factor = Bezier(factor, 0.0f, key.C1, key.C2, key.C3, key.C4, 1.0f);
                    break;
            }

            return factor;
        }
コード例 #4
0
        protected virtual bool IsTriggered(SpriterKey key, float targetTime, float previousTime, float animationLength)
        {
            float timeA = Math.Min(previousTime, targetTime);
            float timeB = Math.Max(previousTime, targetTime);

            if (timeA > timeB)
            {
                if (timeA < key.Time)
                {
                    timeB += animationLength;
                }
                else
                {
                    timeA -= animationLength;
                }
            }
            return(timeA <= key.Time && timeB >= key.Time);
        }
コード例 #5
0
        private static float GetFactor(SpriterKey keyA, SpriterKey keyB, float animationLength, float targetTime)
        {
            float timeA = keyA.Time;
            float timeB = keyB.Time;

            if (timeA > timeB)
            {
                timeB += animationLength;
                if (targetTime < timeA)
                {
                    targetTime += animationLength;
                }
            }

            float factor = MathHelper.ReverseLinear(timeA, timeB, targetTime);

            factor = ApplySpeedCurve(keyA, factor);
            return(factor);
        }
コード例 #6
0
        protected virtual void AddEventData(SpriterAnimation animation, float targetTime, float deltaTime)
        {
            if (animation.Eventlines == null)
            {
                return;
            }

            float previousTime = targetTime - deltaTime;

            for (int i = 0; i < animation.Eventlines.Length; ++i)
            {
                SpriterEventline eventline = animation.Eventlines[i];
                for (int j = 0; j < eventline.Keys.Length; ++j)
                {
                    SpriterKey key = eventline.Keys[j];
                    if (IsTriggered(key, targetTime, previousTime, animation.Length))
                    {
                        FrameData.Events.Add(eventline.Name);
                    }
                }
            }
        }
コード例 #7
0
        private static float GetFactor(SpriterKey keyA, SpriterKey keyB, float animationLength, float targetTime)
        {
            float timeA = keyA.Time;
            float timeB = keyB.Time;

            if(timeA > timeB)
            {
                timeB += animationLength;
                if (targetTime < timeA) targetTime += animationLength;
            }

            float factor = ReverseLinear(timeA, timeB, targetTime);
            factor = ApplySpeedCurve(keyA, factor);
            return factor;
        }