コード例 #1
0
ファイル: SnowStorm.cs プロジェクト: Aurbo99/vixen
		private double CalculateSpeed(double intervalPos)
		{
			var value = ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 100, 1);
			if (value < 1) value = 1;

			return value;
		}
コード例 #2
0
		private int CalculateSpeed(double intervalPos)
		{
			var value = (int)Math.Round(ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 100, 1));
			if (value < 1) value = 1;

			return value;
		}
コード例 #3
0
ファイル: Garlands.cs プロジェクト: robness/Vixen
        private int CalculateSpeed(double intervalPos)
        {
            var value = (int)Math.Round(ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 100, 1) * FrameTime / 50d);

            if (value < 1)
            {
                value = 1;
            }

            return(value);
        }
コード例 #4
0
ファイル: PinWheel.cs プロジェクト: Aurbo99/vixen
        private double CalculateSpeed(double intervalPos)
        {
            var value = ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 50, 1);

            if (value < 1)
            {
                value = 1;
            }

            return(value);
        }
コード例 #5
0
ファイル: SnowStorm.cs プロジェクト: robness/Vixen
        private double CalculateSpeed(double intervalPos)
        {
            var value = ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 100, 1) * FrameTime / 50d;

            if (value < 1)
            {
                value = 1;
            }

            return(value);
        }
コード例 #6
0
        private async Task DecelerateLocomotiveCurve(
            Locomotive ecosLoc,
            SpeedCurve speedCurve,
            int maxSeconds = -1,
            Func <bool> hasToBeCanceled = null
            )
        {
            if (maxSeconds <= -1)
            {
                maxSeconds = speedCurve.MaxTime;
            }

            var currentSpeed   = (float)ecosLoc.Speedstep;
            var maxSpeed       = speedCurve.MaxSpeed;
            var noOfSpeedsteps = ecosLoc.GetNumberOfSpeedsteps();
            var minSpeed       = GetMinSpeed(noOfSpeedsteps);
            var timeSteps      = (speedCurve.MaxTime / (float)maxSpeed) * 1000.0;

            await Task.Run(() =>
            {
                //
                // IMPORTANT NOTE:
                // do not slow down the locomotive completly
                // we still have to reach the fbIn, when reached
                // the train will stop right at this moment
                //

                var sw  = Stopwatch.StartNew();
                var idx = -1;
                for (var i = 0; i < speedCurve.Steps.Count - 1; ++i)
                {
                    var s0 = speedCurve.Steps[i];
                    var s1 = speedCurve.Steps[i + 1];
                    if (currentSpeed >= s0.Speed && currentSpeed < s1.Speed)
                    {
                        idx = i;
                        break;
                    }
                }

                if (idx == -1)
                {
                    idx = speedCurve.Steps.Count - 1;
                }

                for (var i = idx; i > minSpeed; --i)
                {
                    var nextSpeed = speedCurve.Steps[i];

                    //
                    // walltime reached
                    //
                    if (sw.ElapsedMilliseconds / 1000 > maxSeconds)
                    {
                        return;
                    }

                    Ctx.GetClientHandler()?.LocomotiveChangeSpeedstep(ecosLoc, (int)nextSpeed.Speed);

                    __showSpeed((int)nextSpeed.Speed);

                    if (IsCanceled())
                    {
                        Ctx.GetClientHandler()?.LocomotiveChangeSpeedstep(ecosLoc, 0);

                        return;
                    }

                    if (hasToBeCanceled != null)
                    {
                        if (hasToBeCanceled())
                        {
                            return;
                        }
                    }

                    if (__delayDecelerate((int)timeSteps, sw, maxSeconds, hasToBeCanceled))
                    {
                        return;
                    }

                    if (hasToBeCanceled != null)
                    {
                        if (hasToBeCanceled())
                        {
                            return;
                        }
                    }
                }
            }, CancelSource.Token);
        }
コード例 #7
0
 private double CalculateSpeed(double intervalPos)
 {
     return(ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 15, -15));
 }
コード例 #8
0
 private double CalculateSpeed(double intervalPos)
 {
     return(ScaleCurveToValue(SpeedCurve.GetValue(intervalPos), 80, -80) * FrameTime / 50d);
 }
コード例 #9
0
        private async Task AccelerateLocomotiveCurve(
            int currentSpeed,
            Locomotive ecosLoc,
            SpeedCurve speedCurve,
            int maxSeconds = -1,
            Func <bool> hasToBeCanceled = null)
        {
            if (ecosLoc == null)
            {
                return;
            }
            if (speedCurve == null)
            {
                return;
            }

            currentSpeed = KickStart(currentSpeed, ecosLoc);

            if (maxSeconds <= -1)
            {
                maxSeconds = speedCurve.MaxTime;
            }

            var targetSpeed = speedCurve.MaxSpeed;
            var timeSteps   = speedCurve.MaxTime / (float)speedCurve.MaxSpeed * 1000.0;

            await Task.Run(() =>
            {
                var hasCanceled = false;

                var sw = Stopwatch.StartNew();
                var idxOfCurrentSpeed = 0;
                for (var i = 0; i < speedCurve.Steps.Count - 1; ++i)
                {
                    var itSpeed  = speedCurve.Steps[i];
                    var itSpeed2 = speedCurve.Steps[i + 1];
                    if (currentSpeed >= itSpeed.Speed && currentSpeed < itSpeed2.Speed)
                    {
                        idxOfCurrentSpeed = i;
                        break;
                    }
                }

                for (var i = idxOfCurrentSpeed; i <= speedCurve.Steps.Count; ++i)
                {
                    var newSpeed = speedCurve.Steps[i].Speed;
                    Ctx.GetClientHandler()?.LocomotiveChangeSpeedstep(ecosLoc, (int)newSpeed);
                    __showSpeed((int)newSpeed);
                    if (newSpeed >= targetSpeed)
                    {
                        break;
                    }

                    //
                    // walltime reached
                    //
                    if (sw.ElapsedMilliseconds / 1000 > maxSeconds)
                    {
                        return;
                    }

                    if (IsCanceled())
                    {
                        hasCanceled = true;
                        break;
                    }

                    if (hasToBeCanceled != null)
                    {
                        if (hasToBeCanceled())
                        {
                            break;
                        }
                    }

                    if (__delayAccelerate((int)timeSteps, sw, maxSeconds, hasToBeCanceled))
                    {
                        return;
                    }

                    if (hasToBeCanceled != null)
                    {
                        if (hasToBeCanceled())
                        {
                            break;
                        }
                    }
                }

                if (hasCanceled)
                {
                    // TBD
                }
            }, CancelSource.Token);
        }