[SFML] Colisiones con borde de ventana

Iniciado por DeMoNcRaZy, 22 Junio 2015, 23:40 PM

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

DeMoNcRaZy

Buenas,

Tengo un problema con las colisiones en sfml, tengo un cuadrado que manejo con keyboard y quiero que no sobre pase la ventana creada, pero no me deja sigue transpasando los bordes.

Aquí el código:

Código (cpp) [Seleccionar]
#include <SFML/Graphics.hpp>

int main(){
    //Creamos la ventana
    sf::RenderWindow window(sf::VideoMode(800, 600), "Colision");

    //Rectangualo
    sf::RectangleShape rec(sf::Vector2f(50, 50));
    rec.setFillColor(sf::Color::Cyan);

    //Variables colisiones
    int pared_x = 1, pared_y = 1;
    int x_incremento = 2, y_incremento = 2;
    int pared_izq = 0, pared_der = 750;
    int pared_arriba = 0, pared_abajo = 550;

    window.setFramerateLimit(200);

    //Si la ventana está abierta
    while(window.isOpen()){
        //Creamos un evento
        sf::Event ventana;
        //Llamamos a los eventos
        while(window.pollEvent(ventana)){
            //Cerramos la ventana cuando se solicite
            if(ventana.type == sf::Event::Closed){
                window.close();
            }
        }

        //Movimiento rectangulo
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
            rec.move(0, -1);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
            rec.move(0, 1);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
            rec.move(-1, 0);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
            rec.move(1, 0);
        }

        //Colisiones
        if(pared_x <= pared_izq){
            x_incremento =- x_incremento;
        }
        if(pared_x >= pared_der){
            x_incremento =- x_incremento;
        }
        if(pared_y <= pared_arriba){
            y_incremento =- y_incremento;
        }
        if(pared_y >= pared_abajo){
            y_incremento =- y_incremento;
        }

        pared_x = pared_x + x_incremento;
        pared_y = pared_y + y_incremento;

        //Limpiamos ventana
        window.clear();

        //Dibujamos el rectangulo
        window.draw(rec);

        //Actualizamos ventana
        window.display();

    }
}


Sobre pasa el borde de la ventana:



Cuándo no debería pasar el borde de la ventana.

Si alguien tiene alguna de idea de por que puede ser agradecería su respuesta.
Gracias.

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

engel lex

y si intentas imprimr en consola pared_x y pared_izq para verlos en tiempo real y descartar errores numericos?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

DeMoNcRaZy

Hice algo así:

Código (cpp) [Seleccionar]
if(pared_x <= pared_izq){
                std::cout << pared_x;
                std::cout << pared_izq;
            x_incremento =- x_incremento;
}


Me da el resultado de -10:



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

engel lex

no, colocalo fuera del if y colocalo más visual

Código (cpp) [Seleccionar]
std::cout << pared_x << ":" << pared_izq << std::endl;

así distinguir desde que punto se salta o que valor tienes antes
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

ivancea96

#4
Haces cosas muy chulis con las variables esas, pero en ningún momento haces nada con rec.
Lo mueves siempre, sin condición.

Código (cpp) [Seleccionar]
if(rec.getPosition().x<0) rec.setPosition(0, rec.getPosition().y);

Por ejemplo.

Y bueno, ya que coges eventos de la ventana, aprobecha y coge ahí también los de teclas, que es mejor xD

DeMoNcRaZy

He probado lo que me has dicho y funciona bien

Código (cpp) [Seleccionar]
if(rec.getPosition().x<0){
           rec.setPosition(0, rec.getPosition().y);
}


Nunca había usado getPosition, pero más o menos me hago la idea estoy buscando información sobre ello de igual modo si me puedes comentar así por encima como funciona lo agradecería.

Una pregunta:

Código (cpp) [Seleccionar]
if(rec.intersects(rec2)){
           std::cout << "Toca" << std::endl;
       }


Por que al usar dicha función me salta este error:

error: 'class sf::RectangleShape' has no member named 'intersects'|

Cuando supuestamente está bien definida.
Gracias.

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

ivancea96

La función es:
Código (cpp) [Seleccionar]
bool intersecs(Rect a, Rect b);

DeMoNcRaZy

He probado de esta forma:

Código (cpp) [Seleccionar]
sf::FloatRect rect = rec.getGlobalBounds();
        sf::FloatRect rect2 = rec2.getGlobalBounds();

        if(rect.intersects(rect2)){
            std::cout << "Toca" << std::endl;
        }


Y funciona correctamente.

Pero me gustaría saber como funcionaría como me has dicho, si es otra forma más fácil.

Código (cpp) [Seleccionar]
bool intersecs(Rect a, Rect b);


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

ivancea96

Es lo mismo, pero poniendo ambas rectas de argumentos:

Código (cpp) [Seleccionar]
if(intersecs(rec, rec2)) ;