(Boolean / SFML) Как создать логическое значение, которое проверяет столкновение? - PullRequest
0 голосов
/ 25 ноября 2018

Итак, я недавно начал заниматься программированием на SFML, и Мне нужна помощь в создании bool, который проверяет, сталкиваются ли два прямоугольника или перекрывают друг друга.

Это кодfar:

         bool collision(sf::Rect rect, sf::Rect rect2){
        if(rect.getGlobalBounds().intersects(rect2.getGlobalBounds())){
            return true;
        }
        else{
            return false;
        }
     }

Я получаю следующие ошибки:

  • пропущены аргументы шаблона перед 'rect'
  • пропущенаргументы шаблона перед 'rect2'
  • ожидаемое первичное выражение до ')' токен

Я делаю платформер и не могу найти эффективный способ проверить столкновение между игрокоми мир, и я абсолютно презираю необходимость писать этот код снова и снова при написании операторов 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();
    }
}

1 Ответ

0 голосов
/ 25 ноября 2018

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 с и переходит к функции 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();
    }
}

Обратите внимание, что здесь есть и другие проблемы;Например, ваш игровой цикл работает как можно быстрее прямо сейчас, что, вероятно, не то, что вы хотите.Этот код работает, хотя.

...