public ActionMoveUnit2D(IUnit2D unit2D, FloatPoint2D destanationPoint, float speedPerSecond, IActions nextAction = null) { MovingUnit = unit2D; DestanationPoint = destanationPoint; SpeedPerSecond = speedPerSecond; NextAction = nextAction; LastStepTime = default; }
public FloatPoint2D MovingVector() { FloatPoint2D delta = new FloatPoint2D(DestanationPoint.X - MovingUnit.Position.X, DestanationPoint.Y - MovingUnit.Position.Y); float len = delta.VectorLength(); if (len < 0.0001) { return(new FloatPoint2D(0, 0)); } if (Math.Abs(delta.X) < 0.0001) { return(new FloatPoint2D(0, 1)); } if (Math.Abs(delta.Y) < 0.0001) { return(new FloatPoint2D(1, 0)); } return(new FloatPoint2D(delta.X / len, delta.Y / len)); }
public override IActions Progress() { if (LastStepTime == default) { LastStepTime = DateTime.Now; } float StepLength = (float)(DateTime.Now.Subtract(LastStepTime).TotalMilliseconds / 1000.0) * SpeedPerSecond; float sqrDistance = MovingUnit.Position.SquareDistanceF(DestanationPoint); if (sqrDistance < MathF.Pow(StepLength, 2)) { MovingUnit.Position.X = DestanationPoint.X; MovingUnit.Position.Y = DestanationPoint.Y; return(NextAction?.Start()); } FloatPoint2D vector = MovingVector(); MovingUnit.Position.X += vector.X * StepLength; MovingUnit.Position.Y += vector.Y * StepLength; return(this); }
public float DistanceF(FloatPoint2D target) => MathF.Sqrt(SquareDistanceF(target));
public double Distance(FloatPoint2D target) => Math.Sqrt(SquareDistance(target));
public float SquareDistanceF(FloatPoint2D target) => (MathF.Pow(X - target.X, 2) + MathF.Pow(Y - target.Y, 2));
public double SquareDistance(FloatPoint2D target) => (Math.Pow(X - target.X, 2) + Math.Pow(Y - target.Y, 2));