Example #1
0
 public bool Equals(LoopExpression obj)
 {
     if (Min != obj.Min)
     {
         return(false);
     }
     if (Max != obj.Max)
     {
         return(false);
     }
     if (IsGreedy != obj.IsGreedy)
     {
         return(false);
     }
     return(Looped.Equals(obj.Looped));
 }
Example #2
0
        /// <summary>
        /// Tickします。
        /// </summary>
        /// <returns>何Tickしたか。</returns>
        public long Tick()
        {
            // 何Tickしたかのカウント
            var tickCount = 0;
            var nowTime   = DX.GetNowHiPerformanceCount();

            // 停止状態の場合、現在時間をそのままプロパティに代入して、終わる。
            if (State == TimerState.Stopped)
            {
                NowTime = nowTime;
                return(0);
            }

            // 現在時間から以前Tick()したまでの時間の差
            var diffTime = nowTime - NowTime;

            while (diffTime >= Interval)
            {
                // 時間の差が間隔未満になるまで進める
                Value++;
                tickCount++;
                if (Value >= End)
                {
                    if (IsLoop)
                    {
                        // ループ設定かつ現在の値が終了値より大きかったら
                        Value = Begin;
                        Looped?.Invoke(this, null);
                    }
                    else
                    {
                        // 非ループ設定かつ現在の値が終了値より大きかったら、終了値を維持してタイマーを停止する。
                        Value = End;
                        Stop();
                        Ended?.Invoke(this, null);
                    }
                }
                diffTime -= Interval;
            }
            // 余ったdiffTimeを引いて、次Tick()したときにちゃんとなるように
            NowTime = nowTime - diffTime;
            return(tickCount);
        }
 private void OnLooped()
 {
     Looped?.Invoke(this);
     _isAtEnd = false;
 }
Example #4
0
        /// <summary>
        /// Updates the skeleton animation.
        /// </summary>
        /// <param name="currentTime">Current time.</param>
        public void Update(TickCount currentTime)
        {
            // If theres no frames and no modifier, don't update
            if (_mod == null && (_skelSet.KeyFrames.Length == 1) && (CurrentFrame.Skeleton == _skelSet.KeyFrames[0].Skeleton))
            {
                _lastTime = currentTime;
            }
            else
            {
                // Find the time that has elapsed since the last update
                float elapsedTime = currentTime - _lastTime;
                _lastTime = currentTime;

                // Calculate the new frame
                float delay;
                if (CurrentFrame.Delay == 0f)
                {
                    delay = NextFrame.Delay;
                }
                else
                {
                    delay = CurrentFrame.Delay;
                }

                var newFrame = _frame + ((elapsedTime * _speed) / delay);
                if (_skelSet.KeyFrames.Length != 1)
                {
                    newFrame %= _skelSet.KeyFrames.Length;
                }

                // Set the new keyframe references if the frame changed
                if ((int)newFrame != (int)_frame)
                {
                    if (_skelSet.KeyFrames.Length == 1)
                    {
                        _nextFrame = _skelSet.KeyFrames[0];
                        _currFrame = _nextFrame;
                    }
                    else
                    {
                        // If we have reached the first frame, raise the OnLoop event
                        if ((int)newFrame == 0)
                        {
                            if (Looped != null)
                            {
                                Looped.Raise(this, EventArgs.Empty);
                            }
                        }

                        // Store the new frame references
                        _currFrame = _skelSet.KeyFrames[(int)newFrame];
                        _nextFrame = _skelSet.KeyFrames[((int)newFrame + 1) % _skelSet.KeyFrames.Length];
                    }
                }

                // Set the new frame
                _frame = newFrame;

                // Update the nodes of the working skeleton
                var          framePercent = _frame - (int)_frame;
                SkeletonNode parentNode;
                if (_parent == null)
                {
                    parentNode = null;
                }
                else
                {
                    parentNode = _parent.Skeleton.RootNode;
                }
                RecursiveUpdate(CurrentFrame.Skeleton.RootNode, NextFrame.Skeleton.RootNode, parentNode, _skel.RootNode,
                                framePercent);
            }

            // Update the body
            if (_skelBody != null)
            {
                _skelBody.Update(currentTime);
            }

            foreach (var bodyLayer in BodyLayers)
            {
                bodyLayer.Update(currentTime);
            }

            // If there is a parent, apply the changes to it
            if (_parent != null)
            {
                RecursiveUpdateParent(_skel.RootNode, _parent.Skeleton.RootNode);
            }

            // Apply the modifiers
            if (_mod != null)
            {
                _mod.Update(currentTime);
            }
        }