Foro de elhacker.net

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
  1. #include <SFML/Graphics.hpp>
  2.  
  3. int main(){
  4.    //Creamos la ventana
  5.    sf::RenderWindow window(sf::VideoMode(800, 600), "Colision");
  6.  
  7.    //Rectangualo
  8.    sf::RectangleShape rec(sf::Vector2f(50, 50));
  9.    rec.setFillColor(sf::Color::Cyan);
  10.  
  11.    //Variables colisiones
  12.    int pared_x = 1, pared_y = 1;
  13.    int x_incremento = 2, y_incremento = 2;
  14.    int pared_izq = 0, pared_der = 750;
  15.    int pared_arriba = 0, pared_abajo = 550;
  16.  
  17.    window.setFramerateLimit(200);
  18.  
  19.    //Si la ventana está abierta
  20.    while(window.isOpen()){
  21.        //Creamos un evento
  22.        sf::Event ventana;
  23.        //Llamamos a los eventos
  24.        while(window.pollEvent(ventana)){
  25.            //Cerramos la ventana cuando se solicite
  26.            if(ventana.type == sf::Event::Closed){
  27.                window.close();
  28.            }
  29.        }
  30.  
  31.        //Movimiento rectangulo
  32.        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
  33.            rec.move(0, -1);
  34.        }
  35.        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
  36.            rec.move(0, 1);
  37.        }
  38.        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
  39.            rec.move(-1, 0);
  40.        }
  41.        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
  42.            rec.move(1, 0);
  43.        }
  44.  
  45.        //Colisiones
  46.        if(pared_x <= pared_izq){
  47.            x_incremento =- x_incremento;
  48.        }
  49.        if(pared_x >= pared_der){
  50.            x_incremento =- x_incremento;
  51.        }
  52.        if(pared_y <= pared_arriba){
  53.            y_incremento =- y_incremento;
  54.        }
  55.        if(pared_y >= pared_abajo){
  56.            y_incremento =- y_incremento;
  57.        }
  58.  
  59.        pared_x = pared_x + x_incremento;
  60.        pared_y = pared_y + y_incremento;
  61.  
  62.        //Limpiamos ventana
  63.        window.clear();
  64.  
  65.        //Dibujamos el rectangulo
  66.        window.draw(rec);
  67.  
  68.        //Actualizamos ventana
  69.        window.display();
  70.  
  71.    }
  72. }

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
  1. if(pared_x <= pared_izq){
  2.                std::cout << pared_x;
  3.                std::cout << pared_izq;
  4.            x_incremento =- x_incremento;
  5. }

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
  1. 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
  1. 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
  1. if(rec.getPosition().x<0){
  2.            rec.setPosition(0, rec.getPosition().y);
  3. }

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
  1. if(rec.intersects(rec2)){
  2.            std::cout << "Toca" << std::endl;
  3.        }

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

Código:
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
  1. 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
  1. sf::FloatRect rect = rec.getGlobalBounds();
  2.        sf::FloatRect rect2 = rec2.getGlobalBounds();
  3.  
  4.        if(rect.intersects(rect2)){
  5.            std::cout << "Toca" << std::endl;
  6.        }

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
  1. 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
  1. if(intersecs(rec, rec2)) ;