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:
(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.
y si intentas imprimr en consola pared_x y pared_izq para verlos en tiempo real y descartar errores numericos?
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:
(http://i.imgur.com/jTiys0d.png)
Saludos.
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
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
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.
La función es:
bool intersecs(Rect a, Rect b);
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.
Es lo mismo, pero poniendo ambas rectas de argumentos:
if(intersecs(rec, rec2)) ;