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 = WherePlayerCanGetTo(wrapper.FurthestAvailableLocationSoFar, wrapper.FurthestAvailableLocationSoFar + remainingHorizontalMovement, wrapper.BoundingRectangle); Vector2 remainingVerticalMovement = wrapper.OneStep.Y * Vector2.UnitY * stepsLeft; wrapper.FurthestAvailableLocationSoFar = WherePlayerCanGetTo(wrapper.FurthestAvailableLocationSoFar, wrapper.FurthestAvailableLocationSoFar + remainingVerticalMovement, wrapper.BoundingRectangle); } return(wrapper.FurthestAvailableLocationSoFar); }
// De onderstaande functie zorgt ervoor dat wanneer er vanuit een diagonale beweging over wordt gegaan in een non-diagonale beweging het momentum // niet spontaan verloren gaat, maar omgezet wordt in een resterende beweging bij blokkade van de speler op de X-as of Y-as. private Vector2 CheckForNonDiagonalMovement(MovementWrapper wrapper, int i) { if (wrapper.IsDiagonalMove) { int stepsLeft = wrapper.NumberOfStepsToBreakMovementInto - (i - 1); Vector2 remainingHorizontalMovement = wrapper.OneStep.X * Vector2.UnitX * stepsLeft; Vector2 finalPositionIfMovingHorizontally = wrapper.PlausibleCurrentPosition + remainingHorizontalMovement; wrapper.PlausibleCurrentPosition = AllowedMovement(wrapper.PlausibleCurrentPosition, wrapper.PlausibleCurrentPosition + remainingHorizontalMovement, wrapper.BoundingRectangle); Vector2 remainingVerticalMovement = wrapper.OneStep.Y * Vector2.UnitY * stepsLeft; Vector2 finalPositionIfMovingVertically = wrapper.PlausibleCurrentPosition + remainingVerticalMovement; wrapper.PlausibleCurrentPosition = AllowedMovement(wrapper.PlausibleCurrentPosition, wrapper.PlausibleCurrentPosition + remainingVerticalMovement, wrapper.BoundingRectangle); } return(wrapper.PlausibleCurrentPosition); }
// De onderstaande functie controleert of de beweging van de speler mogelijk is binnen de context van de Board. (collision met tiles) public Vector2 AllowedMovement(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.PlausibleCurrentPosition = positionToTry; } else if (move.IsDiagonalMove) { move.PlausibleCurrentPosition = CheckForNonDiagonalMovement(move, i); } break; } return(move.PlausibleCurrentPosition); }
// Até onde o player pode ir public Vector2 WherePlayerCanGetTo(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); }
private Vector2 CheckPossibleNonDiagonalMovement(MovementWrapper wrapper, int i) { if (wrapper.IsDiagonalMove) { int stepsLeft = wrapper.NumberOfStepsToBreakMovementInto - (i - 1); Vector2 remainingHorizontalMovement = wrapper.OneStep.x * Vector2.right * stepsLeft; wrapper.FurthestAvailableLocationSoFar = WhereCanIGetTo(wrapper.FurthestAvailableLocationSoFar, wrapper.FurthestAvailableLocationSoFar + remainingHorizontalMovement, wrapper.BoundingRectangle); Vector2 remainingVerticalMovement = wrapper.OneStep.y * Vector2.up * 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 = new Rectangle((int)positionToTry.x , (int)positionToTry.y , boundingRectangle.w, boundingRectangle.h); drawHitBox(newBoundary, Color.red); if (HasRoomForRectangle(newBoundary)) { move.FurthestAvailableLocationSoFar = positionToTry; } else { if (move.IsDiagonalMove) { move.FurthestAvailableLocationSoFar = CheckPossibleNonDiagonalMovement(move, i); } break; } } return move.FurthestAvailableLocationSoFar; }