Example #1
0
        bool willCollide(Vector2 positionToMoveTo, Texture2D movingObject)
        {
            Vector2 currentViewport = currentMap.getViewport();
            //Vector2 moveToRelativeToScreen = new Vector2(positionToMoveTo.X - currentViewport.X, positionToMoveTo.Y - currentViewport.Y);

            Matrix movingObjectMatrix = Matrix.CreateTranslation(positionToMoveTo.X, positionToMoveTo.Y, 0);

            Color[,] movingObjectColours = Helpers.TextureTo2DArray(movingObject);

            //check for consumable objects
            foreach (ConsumableMapObject obj in currentMap.getNonEnterableObjects())
            {
                Vector2 objPositionRelativeToScreen = new Vector2(obj.getLocation().X - currentViewport.X, obj.getLocation().Y - currentViewport.Y);
                Matrix  objectMatrix = Matrix.CreateTranslation(objPositionRelativeToScreen.X, objPositionRelativeToScreen.Y, 0);

                Color[,] nonEnterableObjectColours = Helpers.TextureTo2DArray(obj.getTexture());

                Vector2 collisionPoint = Helpers.TexturesCollide(nonEnterableObjectColours, objectMatrix, movingObjectColours, movingObjectMatrix);

                if (collisionPoint.X != -1)
                {
                    collidingObject = obj;
                    currentPlayer.setAdjacantObject(obj);
                    return(true);
                }
            }

            //check for enterable objects.
            foreach (EnterableMapObject obj in currentMap.getEnterableObjects())
            {
                Vector2 objPositionRelativeToScreen = new Vector2(obj.getLocation().X - currentViewport.X, obj.getLocation().Y - currentViewport.Y);
                Matrix  objectMatrix = Matrix.CreateTranslation(objPositionRelativeToScreen.X, objPositionRelativeToScreen.Y, 0);

                Color[,] nonEnterableObjectColours = Helpers.TextureTo2DArray(obj.getTexture());

                Vector2 collisionPoint = Helpers.TexturesCollide(nonEnterableObjectColours, objectMatrix, movingObjectColours, movingObjectMatrix);

                if (collisionPoint.X != -1)
                {
                    Vector2 actualObjectPosition = new Vector2((positionToMoveTo.X + currentViewport.X), positionToMoveTo.Y + currentViewport.Y);
                    if (obj.canEnterFromPosition(actualObjectPosition))
                    {
                        worldMapPos = new Vector2((obj.getLocation().X + obj.getTexture().Width / 2) - currentViewport.X, obj.getLocation().Y - currentViewport.Y + obj.getTexture().Height);
                        currentPlayer.setPosition(new Vector2(0, 0));
                        currentMap = obj.getMap();
                    }
                    return(true);
                }
            }

            if (currentMap.moveWillExitMap(positionToMoveTo, movingObject))
            {
                return(true);
            }

            Color[,] exitColours = Helpers.TextureTo2DArray(currentMap.getExitTexture());
            Matrix exitMatrix = Matrix.CreateTranslation(currentMap.getExitPos().X, currentMap.getExitPos().Y, 0);

            Vector2 exitCollisionPoint = Helpers.TexturesCollide(exitColours, exitMatrix, movingObjectColours, movingObjectMatrix);

            if (exitCollisionPoint.X != -1)
            {
                currentPlayer.setPosition(worldMapPos);
                currentMap = worldMap;
                return(true);
            }

            //check for leaving the map
            if (positionToMoveTo.X < 0 || positionToMoveTo.Y < 0 || positionToMoveTo.X > (graphics.PreferredBackBufferWidth - currentPlayer.getTexture().Width) ||
                positionToMoveTo.Y > (graphics.PreferredBackBufferHeight - currentPlayer.getTexture().Height))
            {
                return(true);
            }

            collidingObject = null;
            currentPlayer.setAdjacantObject(null);

            return(false);
        }