/* * 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); }
/* * 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); } } }