elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [SFML] Colisiones con borde de ventana
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SFML] Colisiones con borde de ventana  (Leído 3,772 veces)
DeMoNcRaZy


Desconectado Desconectado

Mensajes: 420


$~*|_


Ver Perfil
[SFML] Colisiones con borde de ventana
« 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:



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.


En línea

Esta página web no está disponible - Google Chrome
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [SFML] Colisiones con borde de ventana
« Respuesta #1 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?


En línea

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


Desconectado Desconectado

Mensajes: 420


$~*|_


Ver Perfil
Re: [SFML] Colisiones con borde de ventana
« Respuesta #2 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:



Saludos.
En línea

Esta página web no está disponible - Google Chrome
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [SFML] Colisiones con borde de ventana
« Respuesta #3 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
En línea

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


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [SFML] Colisiones con borde de ventana
« Respuesta #4 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
« Última modificación: 23 Junio 2015, 00:26 am por ivancea96 » En línea

DeMoNcRaZy


Desconectado Desconectado

Mensajes: 420


$~*|_


Ver Perfil
Re: [SFML] Colisiones con borde de ventana
« Respuesta #5 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.
En línea

Esta página web no está disponible - Google Chrome
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [SFML] Colisiones con borde de ventana
« Respuesta #6 en: 23 Junio 2015, 08:08 am »

La función es:
Código
  1. bool intersecs(Rect a, Rect b);
En línea

DeMoNcRaZy


Desconectado Desconectado

Mensajes: 420


$~*|_


Ver Perfil
Re: [SFML] Colisiones con borde de ventana
« Respuesta #7 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.
En línea

Esta página web no está disponible - Google Chrome
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [SFML] Colisiones con borde de ventana
« Respuesta #8 en: 23 Junio 2015, 14:29 pm »

Es lo mismo, pero poniendo ambas rectas de argumentos:

Código
  1. if(intersecs(rec, rec2)) ;
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
SDL, SFML, algo mejor? « 1 2 »
Programación C/C++
anonimo12121 10 9,801 Último mensaje 26 Octubre 2010, 16:08 pm
por Eternal Idol
Problema Librería SFML
Programación C/C++
overxfl0w13 2 3,079 Último mensaje 28 Junio 2012, 15:02 pm
por anonimo12121
Chat Qt4/SFML « 1 2 »
Programación C/C++
overxfl0w13 14 8,706 Último mensaje 18 Julio 2012, 16:50 pm
por Puntoinfinito
Yo y SFML.
Programación C/C++
frankener1986 1 1,839 Último mensaje 11 Agosto 2013, 00:44 am
por MeCraniDOS
Función para colisiones - c++ /SFML
Programación C/C++
LuKyTa14 9 9,330 Último mensaje 21 Febrero 2022, 12:47 pm
por Lieutenant McFarley
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines