Ver Mensaje Individual
  #8 (permalink)  
Antiguo 25/06/2015, 19:40
Avatar de iblancasa
iblancasa
 
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 11 años, 4 meses
Puntos: 16
Respuesta: [SFML] Colisión rebota

Lo que has hecho tiene la misma lógica de lo que yo te comentaba.

Te hago un código que probablemente no compile, pero te transmitirá la idea. No sé si los tipos están bien. Investiga un poco sobre eso (el compilador te lo dirá).


Supongo que cuanto más abajo a la derecha vayas, mayor es el valor de las coordenadas, pero no estoy seguro.



Código HTML:
void comprobarIntersecta(sf::FloatRect A, sf::FloatRect B){
//A es el que se mueve. B el que está quieto

if(A.top-(B.top+B.height)==0){//Choca con la parte de arriba por abajo del que está quieto
   chocar[0]=true;
}

if((A.top+B.height)-B.top)==0){//Choca con la parte de abajo por arriba del que está quieto
   chocar[1]=true;
}

if((A.left+A.width)-B.left>0){//Choca con la derecha por la izquierda del que está quieto
   chocar[2]=true;
}

if(A.left-(B.left+B.width)>0){//Choca con la izquierda por la derecha del que está quieto
   chocar[2]=true;
}


}


Ahora volvemos al resto del código:

Código:
bool chocar [4] = {false,false,false,false}; //Norte, sur, este y oeste
 
        if(rect.intersects(rect2)){
                comprobarIntersecta(rec.getGlobalBounds(),rect2..getGlobalBounds());
        }
 
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
            if(!chocar[0])
                 rec.setPosition(rec.getPosition().x, rec.getPosition().y-1);
           else{
            chocar[0]=false;
            rec.setPosition(rec.getPosition().x, rec.getPosition().y+1);
           }

        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
           if(!chocar[1])
                 rec.setPosition(rec.getPosition().x, rec.getPosition().y+1);
           else{
            chocar[1]=false;
            rec.setPosition(rec.getPosition().x, rec.getPosition().y-1);
           }
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
           if(!chocar[3])
                 rec.setPosition(rec.getPosition().x-1, rec.getPosition().y);
           else{
            chocar[3]=false;
            rec.setPosition(rec.getPosition().x+1, rec.getPosition().y);
           }

        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
            if(!chocar[2])
                 rec.setPosition(rec.getPosition().x+1, rec.getPosition().y);
           else{
            chocar[2]=false;
            rec.setPosition(rec.getPosition().x-1, rec.getPosition().y);
           }
        }

Sería algo así:
Si intersecta:
Comprobamos por dónde intersecta

Si mueves hacia arriba y está intersectando
Lo echamos uno para abajo
Si no, mueve hacia arriba
(y así con todos: si se puede mover se mueve y, sino, se mueve en sentido contrario uno)





No te preocupes por lo del tiempo. Aquí estamos para aprender y ayudarnos.