Example #1
0
        /*
         * Obtiene el tile con el que un Sprite colisiona.
         *
         * Solo la posicion X o la posicion Y deben ser cambiadas,
         * pero nunca ambas al mismo tiempo.
         *
         * El metodo retorna null si no se detecta una colision.
         */
        public Point?getColisionTile(Sprite sprite, float newX, float newY)
        {
            // Puntos a Pixeles
            float desdeX = Math.Min(sprite.x, newX);
            float desdeY = Math.Min(sprite.y, newY);
            float hastaX = Math.Max(sprite.x, newX);
            float hastaY = Math.Max(sprite.y, newY);

            // Pixeles a Tiles
            int desdeTileX = pixelsATiles(desdeX);
            int desdeTileY = pixelsATiles(desdeY);
            int hastaTileX = pixelsATiles(hastaX + sprite.animacion.obtenerImagen().Width - 1);
            int hastaTileY = pixelsATiles(hastaY + sprite.animacion.obtenerImagen().Height - 1);

            // check each tile for a collision
            for (int x = desdeTileX; x <= hastaTileX; x++)
            {
                for (int y = desdeTileY; y <= hastaTileY; y++)
                {
                    //Colision con Tiles de tipo solido
                    if (x < 0 || x >= ancho || y < 0 || y >= alto || tilesSolid[x][y] != null)
                    {
                        // existe colision, retorna el punto
                        pointCache.X = x;
                        pointCache.Y = y;
                        return(pointCache);
                    }
                    //Colision con Tiles de tipo techo
                    if (sprite.y < newY &&
                        (sprite.y + sprite.animacion.obtenerImagen().Height) <= (TileMap.tilesAPixels(y) + 8) &&
                        tilesTecho[x][y] != null)
                    {
                        // existe colision, retorna el punto
                        pointCache.X = x;
                        pointCache.Y = y;
                        return(pointCache);
                    }
                }
            }

            // No se encontro colision
            return(null);
        }
Example #2
0
        /*
         * Actualiza los sprites con las
         * colisiones de los Tiles y
         * otros Sprites.
         */
        private void actualizarColisiones(Sprite objSprite, long elapsedTime)
        {
            if (objSprite.solidoTiles)
            {
                // Corregir x
                float dx   = objSprite.velocidadX;
                float oldX = objSprite.x;
                float newX = oldX + dx * elapsedTime;
                Point?tile = getColisionTile(objSprite, newX, objSprite.y);
                if (tile != null)
                {
                    // line up with the tile boundary
                    if (dx > 0)
                    {
                        objSprite.x =
                            TileMap.tilesAPixels(tile.Value.X)
                            - objSprite.animacion.obtenerImagen().Width
                            - (objSprite.x - objSprite.x);
                    }
                    else if (dx < 0)
                    {
                        objSprite.x = TileMap.tilesAPixels(tile.Value.X + 1);
                    }
                    objSprite.evento_ColisionHorizontalTile();
                }

                // Corregir y
                float dy   = objSprite.velocidadY;
                float oldY = objSprite.y;
                float newY = oldY + dy * elapsedTime;
                tile = getColisionTile(objSprite, objSprite.x, newY);
                if (tile != null)
                {
                    // line up with the tile boundary
                    if (dy > 0)
                    {
                        objSprite.y = TileMap.tilesAPixels(tile.Value.Y)
                                      - objSprite.animacion.obtenerImagen().Height;
                    }
                    else if (dy < 0)
                    {
                        objSprite.y = TileMap.tilesAPixels(tile.Value.Y + 1);
                    }
                    objSprite.evento_ColisionVerticalTile();
                }
            }

            //if (objSprite.solidoSprites || objSprite is BoxCollisionSprite) {
            if (objSprite.solidoSprites)
            {
                //Colision Horizontal Sprites
                float  dx     = objSprite.velocidadX;
                float  oldX   = objSprite.x;
                float  newX   = oldX + dx * elapsedTime;
                Sprite sprite = getColisionSprite(objSprite, newX, objSprite.y);
                if (sprite != null && sprite.solidoSprites)
                {
                    sprite.evento_ColisionHorizontalSprite(objSprite);
                }
                //Colision Vertical Sprites
                float dy   = objSprite.velocidadY;
                float oldY = objSprite.y;
                float newY = oldY + dy * elapsedTime;
                sprite = getColisionSprite(objSprite, objSprite.x, newY);
                if (sprite != null && sprite.solidoSprites)
                {
                    sprite.evento_ColisionVerticalSprite(objSprite);
                }
            }
        }