示例#1
0
        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);
        }
示例#2
0
        // 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);
        }
示例#3
0
        // 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);
        }
示例#4
0
        // 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;
    }