User Tag List

Resultados 1 al 7 de 7

Tema: Deteccion de colisiones en SDL

  1. #1

    Fecha de ingreso
    Jun 2004
    Ubicación
    Valencia
    Mensajes
    2,122
    Mencionado
    33 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    11
    Agradecer Thanks Received 
    102
    Thanked in
    Agradecido 57 veces en [ARG:2 UNDEFINED] posts

    Question 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

  2. #2

    Fecha de ingreso
    Mar 2004
    Mensajes
    9,785
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    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.
    "This post reminds me of a puzzle..."

  3. #3

    Fecha de ingreso
    Jun 2004
    Ubicación
    Valencia
    Mensajes
    2,122
    Mencionado
    33 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    11
    Agradecer Thanks Received 
    102
    Thanked in
    Agradecido 57 veces en [ARG:2 UNDEFINED] posts
    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?

  4. #4

    Fecha de ingreso
    Jun 2004
    Ubicación
    Valencia
    Mensajes
    415
    Mencionado
    0 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    Prueba con esto:

    http://www.angelfire.com/vamp/genjix.../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);
    3D Sonic Project - De vuelta a la vieja escuela. Demo técnica disponible.

  5. #5

    Fecha de ingreso
    Jun 2004
    Ubicación
    Valencia
    Mensajes
    2,122
    Mencionado
    33 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    11
    Agradecer Thanks Received 
    102
    Thanked in
    Agradecido 57 veces en [ARG:2 UNDEFINED] posts
    Perfectisimo damizean, es justo lo que andaba buscando, alguna libreria en c, gracias Eskema

  6. #6

    Fecha de ingreso
    Jun 2004
    Ubicación
    Valencia
    Mensajes
    2,122
    Mencionado
    33 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    11
    Agradecer Thanks Received 
    102
    Thanked in
    Agradecido 57 veces en [ARG:2 UNDEFINED] posts
    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

  7. #7

    Fecha de ingreso
    Jun 2004
    Ubicación
    Valencia
    Mensajes
    415
    Mencionado
    0 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    Perdona por contestar un poco tarde, tengo una funcion para detectar colisiones (solo probada en windows...), a lo mejor te interesa :
    Archivos adjuntados Archivos adjuntados
    3D Sonic Project - De vuelta a la vieja escuela. Demo técnica disponible.

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •