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)); }
/// <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; }
/// <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); } }