Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: DeMoNcRaZy en 22 Junio 2015, 23:40 PM

Título: [SFML] Colisiones con borde de ventana
Publicado por: DeMoNcRaZy en 22 Junio 2015, 23:40 PM
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:

(http://i.imgur.com/embgrV0.png)

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.
Título: Re: [SFML] Colisiones con borde de ventana
Publicado por: engel lex en 22 Junio 2015, 23:47 PM
y si intentas imprimr en consola pared_x y pared_izq para verlos en tiempo real y descartar errores numericos?
Título: Re: [SFML] Colisiones con borde de ventana
Publicado por: DeMoNcRaZy en 22 Junio 2015, 23:58 PM
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:

(http://i.imgur.com/jTiys0d.png)

Saludos.
Título: Re: [SFML] Colisiones con borde de ventana
Publicado por: engel lex en 23 Junio 2015, 00:06 AM
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
Título: Re: [SFML] Colisiones con borde de ventana
Publicado por: ivancea96 en 23 Junio 2015, 00:21 AM
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
Título: Re: [SFML] Colisiones con borde de ventana
Publicado por: DeMoNcRaZy en 23 Junio 2015, 01:06 AM
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.
Título: Re: [SFML] Colisiones con borde de ventana
Publicado por: ivancea96 en 23 Junio 2015, 08:08 AM
La función es:
Código (cpp) [Seleccionar]
bool intersecs(Rect a, Rect b);
Título: Re: [SFML] Colisiones con borde de ventana
Publicado por: DeMoNcRaZy en 23 Junio 2015, 13:21 PM
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.
Título: Re: [SFML] Colisiones con borde de ventana
Publicado por: ivancea96 en 23 Junio 2015, 14:29 PM
Es lo mismo, pero poniendo ambas rectas de argumentos:

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