detectar colisiones Libgdx-TiledEditor

__TRUNKS__

Buenas, actualmente estoy desarrollando un juego en 2D (una basurita para ir aprendiendo a desarrollar juegos y tal) y tengo un problema al detectar las colisiones del sprite del jugador con los obstáculos del mapa.

Antes de nada, decir que el mapa lo creo con Tiled y lo cargo en Libgdx con una función que permite leer archivos .tmx.

Bien el problema es que, buscando por Internet múltiples formas de detectar colisiones, encontré una que consiste en "leer" una capa determinada (la de los obstáculos) y generar rectángulos/círculos/polígonos como objetos para poder comprobar si en efecto el sprite está colisionando o no. El código es el siguiente:

public class CheckCollision {
	public static void checkCollision(Sprite sprite, TiledMap map) {
		TiledMapTileLayer collisionObjectLayer = (TiledMapTileLayer) map.getLayers().get("obstacles");  // Obtiene la capa donde se encuentran los obstáculos
		MapObjects objects = collisionObjectLayer.getObjects();  // Obtiene los objetos de la capa
		System.out.println(objects.getCount());  // Chivato para comprobar si en efecto a cargado los objetos (aquí el resultado es 0, es decir, no carga nada)
	
           // Creación del rectángulo del objeto y comprobación de la colisión"
	for (RectangleMapObject rectangleObject : objects.getByType(RectangleMapObject.class)) {  
	    com.badlogic.gdx.math.Rectangle rectangle = rectangleObject.getRectangle();
	    if (Intersector.overlaps(rectangle, sprite.getBoundingRectangle())) {
	        System.out.println("Colission happened");
	    }
	}
}
}

Pues bien, como indiqué en la línea 5, el chivato me dice que la cantidad de objetos que obtuvo fueron 0, no cargó nada vamos. Esto me llevó a mirar si el problema era de como los cree en Tiled pero miré varios tutoriales y todos lo hacían como estaba haciendo yo: creando una nueva capa de patrones y poniendo el nombre que querías a dicha capa.

Finalmente pensé que si lo que estaba cargando del mapa eran objetos pues la capa debía ser una nueva capa de objetos, la cree y la intenté cargar pero entonces me saltó el siguiente error:

Exception in thread "LWJGL Application" java.lang.ClassCastException: com.badlogic.gdx.maps.MapLayer cannot be cast to com.badlogic.gdx.maps.tiled.TiledMapTileLayer

Error que no da si creas una nueva capa de patrones. Y bueno ahora estoy aquí buscando soluciones y mirando por Internet pero no encuentro el fallo.

Gracias de antemano.

__TRUNKS__

Bueno al final conseguí arreglarlo, por si a alguien le interesa lo contaré:

Harto ya de los errores que daban los objetos, patrones o lo que quiera que se necesitara para realizar el método que explicaba arriba, me decidí por coger cada tile de la capa de obstáculos al inicio del programa, convertirlos en sprites y guardarlos en un array. Este array se recorrerá después antes de la renderización comparando si los rectángulos del jugador colisionan con alguno de los obstáculos.

Código de la creación de los sprites al inicio del programa:

obstaclesMap = new Array<TiledMapTileLayer.Cell>();
		TiledMapTileLayer collisionLayer = (TiledMapTileLayer) map.getLayers().get("obstacles");	
		
	obstaclesSprites = new Array<Sprite>();
	for(int x=0 ; x<collisionLayer.getWidth() ; x++) {
		for(int y=0 ; y<collisionLayer.getHeight() ; y++) {
			TiledMapTileLayer.Cell cell = collisionLayer.getCell(x, y);
			if(cell != null) {  // Si la celda existe...			
				Sprite cellSprite = new Sprite(cell.getTile().getTextureRegion());
				cellSprite.setPosition(x*16, y*16);  // 16 son los píxeles que mide cada tile, con esta operación transformas la posición en el mapa a posición del mundo
				obstaclesSprites.add(cellSprite);
			}
		}
	}

Código antes de la renderización:

CheckCollision.checkCollision(player.getCurrentSprite(), obstaclesSprites);

Código del método checkCollision:

public class CheckCollision {
	public static void checkCollision(Sprite sprite1, Sprite sprite2) {
		if(Intersector.overlaps(sprite1.getBoundingRectangle(), sprite2.getBoundingRectangle()))
			System.out.println("collision happened");
	}
	
public static void checkCollision(Sprite sprite, Array<Sprite> spritesGroup) {		
	for(Sprite spriteGroup : spritesGroup) {
		checkCollision(sprite, spriteGroup);
	}
}
}

Usuarios habituales

  • __TRUNKS__