[SFML] Rebote de colisión

Iniciado por DeMoNcRaZy, 24 Junio 2015, 22:12 PM

0 Miembros y 1 Visitante están viendo este tema.

ivancea96

Código (cpp) [Seleccionar]
if(rec.getPosition().y>=rect2.left)
Eso será rect2.top, no .left.

De cualquier forma, es emétodo lo que hace es corregir progresivamente la superposición de los rectángulos. Una colisión es una colisión.

Una opción, es, en el código de movimiento, tras moverse, comprobar con intersecs(). En caso verdadero, deshaces el movimiento. Es una forma muy simple, pero efectiva en casos también simples.

DeMoNcRaZy

De igual modo al colocar (.top):

Código (cpp) [Seleccionar]
if(rec.getPosition().x<=rect2.left){
                rec.setPosition(rec.getPosition().x-1, rec.getPosition().y);
            }
            if(rec.getPosition().x>=rect2.left){
                rec.setPosition(rec.getPosition().x+1, rec.getPosition().y);
            }
            if(rec.getPosition().y<=rect2.top){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y-1);
            }
            if(rec.getPosition().y>=rect2.top){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y+1);
            }


Me da el mismo error que muestra al comenzar el vídeo, intento chocar con la figura pero al chocar se desplaza sola cuando se debería estar quieta sin poder avanzar más hasta que yo cambie de movimiento.

Código (cpp) [Seleccionar]
if(rec.getPosition().y<=rect2.top){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y-1);
            }
            if(rec.getPosition().y>=rect2.top){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y+1);
            }



Referente a:

Una opción, es, en el código de movimiento, tras moverse, comprobar con intersecs(). En caso verdadero, deshaces el movimiento. Es una forma muy simple, pero efectiva en casos también simples.

¿Te refieres a crear una función?


Saludos!
Esta página web no está disponible - Google Chrome

ivancea96

Si yo no digo que eso lo corrigiera, pero era técnicamente incorrecto. Si funcionó era porque X e Y son iguales.
Lo que digo es que, tras hacer el .move() al captar las teclas, en caso de que esté en una zona incorrecta, que haga un .move inverso.

Maurice_Lupin

#13
Hola, podrias utilizar otro rectangulo que se mueve, detectas si colisiona con rec2
Código (cpp) [Seleccionar]

     //Movimiento otro rectangulo
      if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
          otroRec.move(0, -1);
      }
      // ...  detectando teclas para otroRec

     if( !otroRec.intersects(rect2) ) { // Si no hay interseccion, actualizas el move
         rec.move(otroRec.getPosition().x, otroRec.getPosition().y);
     }
     // otroRec no lo tienes que pintar


Si te interesa averiguar sobre programación de juegos, vi por ahi un manual para juegos en C++ con Allegro, usa clases, excelentes conceptos me dio una idea sobre los videojuegos. Incluso hay un capitulo sobre colisiones.

El link : CURSO DE PROGRAMACIÓN DE VIDEJUEGOS CON C++ Y ALLEGRO

Saludos.
Un error se comete al equivocarse.