Hola estoy teniendo un problema para poder hacer que varios rectángulos colisiones con el jugador para armar una especie de laberinto, este es el código de la función que quiero hacer:
void intersecciona(RectangleShape jugador, RectangleShape pared) {
FloatRect jug = jugador.getGlobalBounds();
FloatRect pare = pared.getGlobalBounds();
if(jug.intersects(pare)){
if(jugador.getPosition().x<pared.getPosition().x)
jugador.setPosition(jugador.getPosition().x-10, jugador.getPosition().y);
if(jugador.getPosition().x>pared.getPosition().x)
jugador.setPosition(jugador.getPosition().x+10, jugador.getPosition().y);
if(jugador.getPosition().y<pared.getPosition().y)
jugador.setPosition(jugador.getPosition().x, jugador.getPosition().y-10);
if(jugador.getPosition().y>pared.getPosition().y)
jugador.setPosition(jugador.getPosition().x, jugador.getPosition().y+10);
}
}
El programa asi funciona para una pared, pero seria incorrecto hacer los if para cada pared:
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace sf;
using namespace std;
int main(){
//Creamos la ventana
RenderWindow window(sf::VideoMode(800, 600), "LABERINTO XD");
//Rectangualo
RectangleShape rec(Vector2f(40, 40));
rec.setFillColor(Color::Cyan);
//rec2es
RectangleShape rec2(Vector2f(50, 300));
rec2.setFillColor(Color::Magenta);
rec2.setPosition(400, 300);
RectangleShape rec20(Vector2f(50, 230));
rec20.setFillColor(Color::Magenta);
rec20.setPosition(400, 0);
RectangleShape rec3(Vector2f(50, 500));
rec3.setFillColor(Color::Magenta);
rec3.setPosition(300,0);
RectangleShape rec4(Vector2f(50, 350));
rec4.setFillColor(Color::Magenta);
rec4.setPosition(200, 250);
RectangleShape rec5(Vector2f(50, 150));
rec5.setFillColor(Color::Magenta);
rec5.setPosition(1000, 100);
window.setFramerateLimit(120);
//Si la ventana está abierta
while(window.isOpen()){
//Creamos un evento
Event ventana;
//Llamamos a los eventos
while(window.pollEvent(ventana)){
//Cerramos la ventana cuando se solicite
if(ventana.type == Event::Closed){
window.close();
}
}
//Movimiento rectangulo
if(Keyboard::isKeyPressed(Keyboard::Up)){
rec.move(0, -1);
}
if(Keyboard::isKeyPressed(Keyboard::Down)){
rec.move(0, 1);
}
if(Keyboard::isKeyPressed(Keyboard::Left)){
rec.move(-1, 0);
}
if(Keyboard::isKeyPressed(Keyboard::Right)){
rec.move(1, 0);
}
//Colisiones
if(rec.getPosition().x<0){
rec.setPosition(0, rec.getPosition().y);
}
if(rec.getPosition().x>750){
rec.setPosition(750, rec.getPosition().y);
}
if(rec.getPosition().y<0){
rec.setPosition(rec.getPosition().x, 0);
}
if(rec.getPosition().y>550){
rec.setPosition(rec.getPosition().x, 550);
}
FloatRect rect = rec.getGlobalBounds();
FloatRect rect2 = rec2.getGlobalBounds();
FloatRect rect3 = rec3.getGlobalBounds();
FloatRect rect4 = rec4.getGlobalBounds();
FloatRect rect5 = rec5.getGlobalBounds();
if(rect.intersects(rect2)){
if(rec.getPosition().x<rec2.getPosition().x)
rec.setPosition(rec.getPosition().x-10, rec.getPosition().y);
if(rec.getPosition().x>rec2.getPosition().x)
rec.setPosition(rec.getPosition().x+10, rec.getPosition().y);
if(rec.getPosition().y<rec2.getPosition().y)
rec.setPosition(rec.getPosition().x, rec.getPosition().y-10);
if(rec.getPosition().y>rec2.getPosition().y)
rec.setPosition(rec.getPosition().x, rec.getPosition().y+10);
}
//Limpiamos ventana
window.clear();
//Dibujamos el rectangulo
window.draw(rec);
window.draw(rec2);
window.draw(rec20);
window.draw(rec3);
window.draw(rec4);
window.draw(rec5);
//Actualizamos ventana
window.display();
}
}