[libgdx] colisiones en libgdx

codek0rZ

Buenas, estoy probando el juego que he realizado, estoy optimizandolo y me encuentro con el siguiente bug. He utilizado "overlaps" para las colisiones y quería saber si es una buena forma de efectuar las colisiones. No entiendo muy bien porque aveces me da el resultado esperado y aveces no. Por ejemplo, tengo un enemigo (un pajaro) que si me toca muero, bien, pues sin que llege a tocarme muero xD. No entiendo el porque he intentado pintar los diferentes texturas y no hay colisión.
Una imagen de cuando muero:


El método que implementa la colisión es el siguiente:
(hace una cosa diferente si colisiona por la parte de arriba (con la que tambien tengo problemas) y por cualquier otro lado cuando salto.

	private void birdsCollisions(){
		for(Bird b : birds){ // lame es el personaje principal
			if(b.bounds.overlaps(lame.bounds)){
				if(lame.position.y > b.position.y){
					lame.hitBird();
					score = score*2;
				}
				else lame.dead();
			}
		}
	}

Agradezco cualquier tip/ayuda para un novato :)

saludos!

FrioneL

Esos bounds no estarn funcionando como tu esperas.

Debuga y mira los valores que tienen cuando hay colision.

1 respuesta
Adyrhan

Si, creo que esos bounds pueden ser mas grandes de lo que tu crees que son, por eso colisiona aparentemente sin tocarlo. Por el codigo que has puesto no lo puedo saber, pero cabe la posibilidad que estes usando unos bounds derivados de los sprites que estas usando, tomando todo el tamaño de la imagen, segun este enlace de la documentacion.

Puedes usar esto en su lugar e incluso usar varios por cada sprite, para aumentar la precisión en la detección de colision:Bounding Box

1 respuesta
Cyph3r

Te recomiendo tener una opción para renderizar tus bounds , yo lo tengo siempre activado asi veo si las colisiones son como yo las espero.

Usa shapeRenderer para dibujarlo en tu render.

1 respuesta
codek0rZ

Lo primero, perdón por tardar en conestar, he estado de examenes y no he podido tocar le juego apenas.

#2 #4 bien gracias por responder, si supongo que son los bounds, por ello he dibujado con los bounds del personaje y los pajaros de la siguiente manera:

		sr.begin(ShapeType.Line);
		sr.setColor(Color.RED);
		for(Bird b : world.birds){
			sr.rect(b.bounds.x*30, b.bounds.y*30, b.bounds.width*30, b.bounds.height*30);	
		}
		sr.rect(world.lame.position.x*30, world.lame.position.y*30, world.lame.bounds.width*30, world.lame.bounds.height*30);
		sr.end();

Primero lo hacía sin multiplicar por 30, pero dado que mi escala es 1:30, lo obtenia de la siguiente manera:

Después de pensar un poco, dije hostia claro tendre que multiplicar por la escala, así hice obteniendo el siguiente resultado

En ambas imagenes estoy teniendo una colisión, en la segunda se ve que no estan colisionando los bounds, pero el overlaps me devuelve true.

De paso he colgado el código en GitHub aquí el enlace: https://github.com/codekorz/LameJumper

Ahora que tengo tiempo, voy a ver si lo soluciono y de paso mirar lo que me dijo #3 .

Muchas gracias a los tres por responder y si veis algo en mi código para criticarme lo agradezco :) el fin de todo esto es aprender.

KeTo

Buenas, ¿has comprobado que lo que te mata sean los pájaros y no la "altura" del personaje?, has dicho que escalas, pero aquí no se ve esa escala:

private void lameDead(){
	if(heightCam - WorldRender.HEIGHT/2 > lame.position.y+Lame.HEIGHT) lame.dead();
}

Tampoco estoy muy seguro (y hoy he terminado mi último examen, así que estoy un poco espeso :P ). Prueba a debugear (o hazlo a lo burro metiendo un system.out.print antes de ejecutar el lame.dead() ) y así ves el que se ejecuta.

Un saludo.

1 respuesta
codek0rZ

#6 La altura y anchura que tiene cada clase ya esta en la escala que menciono.
He vuelto a probar (aunque creo que ya lo probe) y sí, es el pajaro lo que me mata, no es referente a que se piense que me he caido ya.

Usuarios habituales

  • codek0rZ
  • KeTo
  • Cyph3r
  • Adyrhan
  • FrioneL