Ver la versión completa : Deteccion de colisiones en SDL
Hola a todos de nuevo, tras haber visto varios tutoriales sobre deteccion no consigo aclararme sobre como implementarlo en la SDL, ¿alguno ha tratado el tema? he visto varias librerias pero todas en c++ con lo cual no me sirven de mucho si quiero hacer algo en la gp. He empezado a hacer algo como esto pero no se si voy en la direccion correcta, ni como hacer luego la llamada al metodo colision
int colision (SDL_Rect Cuadro, SDL_Rect CuadroEnemigo){
int w1,h1,w2,h2,x3,y3,x4,y4;
w1=Cuadro.w;
h1=Cuadro.h;
w2=CuadroEnemigo.w;
h2=CuadroEnemigo.h;
x3=Cuadro.x;
y3=Cuadro.y;
x4=CuadroEnemigo.x;
y4=CuadroEnemigo.y;
if(((x1+w1 *0.60)>x3)&&((y1+h1*0.60)>y4)&&((x2+w2*0.60)>x3)&&((y2+h2*0.60)>y3))
{
return TRUE;
} else {
return FALSE;
}
}
¿Alguien me tira un cable? gracias y saludos, Eskema
Te podria poner el codigo resuelto, pero veo que tienes muchos fallos y creo que aprenderas mas corrigiendolos tu.
Para empezar, tienes que dar nombres con sentido a las variables. Si pones un sufijo numerico, asegurate de que tiene algun sentido, como por ejemplo poner '1' para el jugador (x1, y1, w1, h1) y '2' para los enemigos (x2, y2, w2, h2). Asi sera mucho mas sencillo saber a que pertenece cada variable.
Por otra parte, tampoco era muy necesario usar las variables, podrias haber utilizado los componentes de rect en el if directamente (cuadro.x + cuadro.w * 0,60... ), pero eso es a gusto del programador.
Para acabar, fijate que en el if usas variables que no has declarado: x1, y1, x2, y2. Corrige tambien eso.
Y fijate bien en lo que estas haciendo en las desigualdades ('>' y '<') y piensa lo que estas comparando, que me parece que has copiao eso de algun lado sin entender muy bien lo que hace... estaria bien que hicieras un dibujo con lo que significa cada letra para aclararte.
Un saludo, y si sigues teniendo dudas vuelve a postear el nuevo codigo.
Evidentemente he escrito fallos, (no se puede teclear tan deprisa) pero el codigo lo entiendo perfectamente. Lo que hace es comparar el ancho, alto y las posiciones x e y del sprite y las compara con el otro sprite, pero en vez de comparar un cuadro (rect) tal cual lo comparo un 60% mas pequeño pq como todos sabemos un grafico no ocupa el cuadro al 100% siempre quedan espacios vacios y si solo comparamos que 2 cuadros se solapen, obtendriamos una colision aunque los graficos que vemos en pantalla no se estuvieran tocando. De ahi que uso 2 cuadros un poco mas pequeños para la comparacion. Aqui te pongo la rutina corregida como toca ;)
int colision (SDL_Rect Cuadro, SDL_Rect CuadroEnemigo){
int w1,h1,w2,h2,x1,y1,x2,y2;
w1=Cuadro.w;
h1=Cuadro.h;
w2=CuadroEnemigo.w;
h2=CuadroEnemigo.h;
x1=Cuadro.x;
y1=Cuadro.y;
x2=CuadroEnemgio.x;
y2=CuadroEnemigo.y;
//añadiendo el 0.60 lo que hacemos es calcular un cuadrado mas pequeño para la colision, puede variar el %porcentaje;
if(((x1+(w1 *0.60))>x2)&&((y1+(h1 * 0.60))>y2) &&((x2+(w2 * 0.60))>x1)&&((y2+(h2 * 0.60))>y1))
{
return TRUE;
}else{
return FALSE;
}
}
Lo que no se muy bien si no habria otra forma, ahora bien ¿como hago la llamada?
raqueta es una SDL_Surface y balon idem de lo mismo
colision(raqueta, balon)
No se muy bien como seguir en este punto, es decir si implemento el metodo tal cual lo tengo lo ¿como hago las comprobaciones de colision?
Supongo que deberia añadir el codigo a la funcion, usea return true, grafico=destruyelo o algo asi ¿no?
Damizean
23/02/2005, 14:41
Prueba con esto:
http://www.angelfire.com/vamp/genjix/sdl_lib/SDL_Collide.h
Los prototipos de las funciones pixelperfectas son:
SDL_Collide( SurfaceA , Ax , Ay , SurfaceB , Bx , By );
Y para comprobar colisiones de cajas:
SDL_BoundingCollide( SurfaceA , Ax , Ay , SurfaceB , Bx , By );
SDL_BoundingCollide(RectA , RectB);
Perfectisimo damizean, es justo lo que andaba buscando, alguna libreria en c, gracias Eskema
Hmm no consigo hacer funcionar el metodo, Damizean como lo compilas tu? tal vez sea por el guindous, ya que la libreria dice que solo esta testeada en linux
Damizean
28/04/2005, 02:34
Perdona por contestar un poco tarde, tengo una funcion para detectar colisiones (solo probada en windows...), a lo mejor te interesa :
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.