所以我最近开始进行SFML编程,我需要帮助创建一个bool来检查两个矩形是否碰撞或彼此重叠。
到目前为止,这是代码:
bool collision(sf::Rect rect, sf::Rect rect2){
if(rect.getGlobalBounds().intersects(rect2.getGlobalBounds())){
return true;
}
else{
return false;
}
}
我收到以下错误消息:
我正在开发平台游戏,无法找到一种有效的方法来测试玩家与世界之间的碰撞,因此我绝对不愿意在编写if语句时一次又一次地编写该代码,所以我想要检查他们是否正在碰撞,触摸,相交,无论您要调用它什么。
我希望做出这样的if陈述,或者至少是我想到的:
if(collision(rectangle1,rectangle2) == true){
std::cout << "collision" << std::endl;
}
顺便说一句,我正在使用代码块ide。
我确实尝试过在线寻求帮助,但找不到能解决我的特定问题的任何东西。我认为这与我正在使用SFML有关,但尚未得到证实。
我认为我不必包括其余的代码,因为我的问题就在这里,并且没有与其他任何东西相连,所以希望您能在这里找到问题所在。 如有必要,请不要犹豫,向我询问我的计划的其余部分。
感谢您的帮助! :)
编辑:这是我的代码:
#include <SFML/Graphics.hpp>
#include <SFML/Window/Keyboard.hpp>
#include <SFML/Graphics/Rect.hpp>
int main(){
sf::RenderWindow window(sf::VideoMode(800,600),"INSERT_WINDOW_TITLE", sf::Style::Titlebar | sf::Style::Close);
sf::RectangleShape rect1(sf::Vector2f(20.f,20.f));
rect1.setFillColor(sf::Color::Blue);
sf::RectangleShape rect2(sf::Vector2f(20.f,20.f));
rect2.setFillColor(sf::Color::Green);
bool collision(sf::FloatRect r1, sf::FloatRect r2)
{
return r1.intersects(r2, sf::FloatRect());
}
while(window.isOpen()){
sf::Event event;
while(window.pollEvent(event)){
if (event.type == sf::Event::Closed)
window.close();
}
if(sf::Keyboard::isKeyPressed(sf::KeyBoard::W) && collision(rect1,rect2) == false) rect1.move(0.f,-1.f);
if(sf::Keyboard::isKeyPressed(sf::KeyBoard::S) && collision(rect1,rect2) == false) rect1.move(0.f,1.f);
if(sf::Keyboard::isKeyPressed(sf::KeyBoard::A) && collision(rect1,rect2) == false) rect1.move(-1.f,0.f);
if(sf::Keyboard::isKeyPressed(sf::KeyBoard::D) && collision(rect1,rect2) == false) rect1.move(1.f,0.f);
window.draw(rect1);
window.draw(rect2);
window.display();
}
}
答案 0 :(得分:2)
Rect
是一个类模板,而不是实际的类。对于typedef
和IntRect
,分别有分别称为FloatRect
和Rect<int>
的预定义Rect<float>
。您要使用其中之一:
bool collision(sf::FloatRect r1, sf::FloatRect r2)
{
sf::FloatRect intersection;
return r1.intersects(r2, intersection);
}
更新:
这是您代码的“固定”版本。我添加了一个重载,它需要Shape
s并转发到Rect
冲突检查功能。我还重新放置了您的rect2
矩形;否则,您将无法移动,因为已经发生碰撞。
#include <SFML/Graphics.hpp>
#include <SFML/Window/Keyboard.hpp>
bool collision(sf::FloatRect r1, sf::FloatRect r2)
{
sf::FloatRect intersection;
return r1.intersects(r2, intersection);
}
bool collision(sf::Shape const & r1, sf::Shape const & r2)
{
return collision(r1.getGlobalBounds(), r2.getGlobalBounds());
}
int main(){
sf::RenderWindow window(sf::VideoMode(800,600),"INSERT_WINDOW_TITLE", sf::Style::Titlebar | sf::Style::Close);
sf::RectangleShape rect1(sf::Vector2f(20.f,20.f));
rect1.setFillColor(sf::Color::Blue);
sf::RectangleShape rect2(sf::Vector2f(20.f,20.f));
rect2.setFillColor(sf::Color::Green);
rect2.setPosition(100.f, 100.f);
while(window.isOpen()){
sf::Event event;
while(window.pollEvent(event)){
if (event.type == sf::Event::Closed)
window.close();
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::W) && collision(rect1,rect2) == false) rect1.move(0.f,-1.f);
if(sf::Keyboard::isKeyPressed(sf::Keyboard::S) && collision(rect1,rect2) == false) rect1.move(0.f,1.f);
if(sf::Keyboard::isKeyPressed(sf::Keyboard::A) && collision(rect1,rect2) == false) rect1.move(-1.f,0.f);
if(sf::Keyboard::isKeyPressed(sf::Keyboard::D) && collision(rect1,rect2) == false) rect1.move(1.f,0.f);
window.clear();
window.draw(rect1);
window.draw(rect2);
window.display();
}
}
请注意,这里还有其他问题;例如您的游戏循环现在会尽可能快地运行,这可能不是您想要的。这段代码确实可以运行。