private Vector2 CheckPossibleNonDiagonalMovement(MovementWrapper wrapper, int i) { if (wrapper.IsDiagonalMove) { int stepsLeft = wrapper.NumberOfStepsToBreakMovementInto - (i - 1); Vector2 remainingHorizontalMovement = wrapper.OneStep.X * Vector2.UnitX * stepsLeft; wrapper.FurthestAvailableLocationSoFar = WhereCanIGetTo(wrapper.FurthestAvailableLocationSoFar, wrapper.FurthestAvailableLocationSoFar + remainingHorizontalMovement, wrapper.BoundingRectangle); Vector2 remainingVerticalMovement = wrapper.OneStep.Y * Vector2.UnitY * stepsLeft; wrapper.FurthestAvailableLocationSoFar = WhereCanIGetTo(wrapper.FurthestAvailableLocationSoFar, wrapper.FurthestAvailableLocationSoFar + remainingVerticalMovement, wrapper.BoundingRectangle); } return wrapper.FurthestAvailableLocationSoFar; }
public Vector2 WhereCanIGetTo(Vector2 originalPosition, Vector2 destination, Rectangle boundingRectangle) { MovementWrapper move = new MovementWrapper(originalPosition, destination, boundingRectangle); for (int i = 1; i <= move.NumberOfStepsToBreakMovementInto; i++) { Vector2 positionToTry = originalPosition + move.OneStep * i; Rectangle newBoundary = CreateRectangleAtPosition(positionToTry, boundingRectangle.Width, boundingRectangle.Height); if (HasRoomForRectangle(newBoundary)) { move.FurthestAvailableLocationSoFar = positionToTry; } else { if (move.IsDiagonalMove) { move.FurthestAvailableLocationSoFar = CheckPossibleNonDiagonalMovement(move, i); } break; } } return move.FurthestAvailableLocationSoFar; }