Autor
|
Tema: [SFML] Colisiones con borde de ventana (Leído 3,773 veces)
|
DeMoNcRaZy
Desconectado
Mensajes: 420
$~*|_
|
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:#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.
|
|
|
En línea
|
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?
|
|
|
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
Mensajes: 420
$~*|_
|
Hice algo así: if(pared_x <= pared_izq){ std::cout << pared_x; std::cout << pared_izq; x_incremento =- x_incremento; }
Me da el resultado de -10: Saludos.
|
|
|
En línea
|
Esta página web no está disponible - Google Chrome
|
|
|
engel lex
|
no, colocalo fuera del if y colocalo más visual 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
Mensajes: 3.412
ASMático
|
Haces cosas muy chulis con las variables esas, pero en ningún momento haces nada con rec. Lo mueves siempre, sin condición. 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
Mensajes: 420
$~*|_
|
He probado lo que me has dicho y funciona bien 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: 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.
|
|
|
En línea
|
Esta página web no está disponible - Google Chrome
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
La función es: bool intersecs(Rect a, Rect b);
|
|
|
En línea
|
|
|
|
DeMoNcRaZy
Desconectado
Mensajes: 420
$~*|_
|
He probado de esta forma: 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. bool intersecs(Rect a, Rect b);
Saludos.
|
|
|
En línea
|
Esta página web no está disponible - Google Chrome
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Es lo mismo, pero poniendo ambas rectas de argumentos: if(intersecs(rec, rec2)) ;
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
SDL, SFML, algo mejor?
« 1 2 »
Programación C/C++
|
anonimo12121
|
10
|
9,801
|
26 Octubre 2010, 16:08 pm
por Eternal Idol
|
|
|
Problema Librería SFML
Programación C/C++
|
overxfl0w13
|
2
|
3,079
|
28 Junio 2012, 15:02 pm
por anonimo12121
|
|
|
Chat Qt4/SFML
« 1 2 »
Programación C/C++
|
overxfl0w13
|
14
|
8,707
|
18 Julio 2012, 16:50 pm
por Puntoinfinito
|
|
|
Yo y SFML.
Programación C/C++
|
frankener1986
|
1
|
1,839
|
11 Agosto 2013, 00:44 am
por MeCraniDOS
|
|
|
Función para colisiones - c++ /SFML
Programación C/C++
|
LuKyTa14
|
9
|
9,358
|
21 Febrero 2022, 12:47 pm
por Lieutenant McFarley
|
|