1

我编写了一个简单的程序,屏幕上有两个立方体,一个用户可以移动,另一个是静止的。我刚开始使用 sfml,从未接触过碰撞,所以这对我来说是全新的。在我的代码中,我的目标是在用户将立方体引导到静止的立方体时弹出一个警告窗口。然而,问题是,一旦我启动程序,警告窗口就会出现,即使它在 if 循环中。这是我的代码:

    #include <SFML/Graphics.hpp>
    #include <SFML/Window.hpp>
    #include <iostream>

    using namespace std;

    bool isCollision(int x, int y, int x2, int y2){ // borrowed function, all credits go to whom ever made it
        if (abs(x2 - x) > 20 || abs(y2 - y) > 20)
            return false;
        else
            return true;
    }

    int main()
    {
        sf::RenderWindow App(sf::VideoMode(800, 600, 32), "My SFML Window");
        sf::RenderWindow Warning(sf::VideoMode(400, 225, 32), "WARNING!");
        sf::Shape Rect = sf::Shape::Rectangle(0, 0, 20, 20, sf::Color::Red);
        sf::Shape Rect2 = sf::Shape::Rectangle(50, 0, 70, 20, sf::Color::Blue);


        while (App.IsOpened())
        {
            sf::Event event;
            while (App.GetEvent(event)) // I now know the shorter way to handle events, just haven't edited it yet. No functional difference
            {
                if (event.Type == sf::Event::Closed)
                    App.Close();
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Escape))
                    App.Close();
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Right))
                    Rect.Move(5.0, 0);
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Left))
                    Rect.Move(-5.0, 0);
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Down))
                    Rect.Move(0, 5.0);
                if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Up))
                    Rect.Move(0, -5.0);

            }

            int x = Rect.GetPosition().x;
            int y = Rect.GetPosition().y;

            int x2 = Rect2.GetPosition().x;
            int y2 = Rect2.GetPosition().y;

            isCollision(x, y, x2, y2);

            if (isCollision(x, y, x2, y2) == true) // if loop that I am messing up somehow
            }
                Warning.Clear(sf::Color::White);

            }

            App.Clear();
            App.Draw(Rect);
            App.Draw(Rect2);
            App.Display();
        }

        return EXIT_SUCCESS;
    }

我从正在观看的 tut 中获得了 bool isCollision 函数,但是 tut 是在 allegro 中完成的,所以我尽可能地从中刮取。(我使用他的函数的逻辑是我们的立方体大小完全相同,并且它们的属性相同[一个移动一个静止]。我认为问题必须在于我如何调用该函数。任何和所有的帮助都很大赞赏

4

5 回答 5

1

我认为你的函数没有正确返回,你应该这样尝试。(仅供参考 2 回报是真正的坏习惯)

bool isCollision(int x, int y, int x2, int y2){
     bool exitVal;   // maybe make it static if this is being called over and over
     if (abs(x2 - x) > 20 || abs(y2 - y) > 20)
         exitVal = false;
     else
         exitVal = true;

     return exitVal;
}

希望这会有所帮助:D

于 2011-08-09T06:02:02.807 回答
1

在您的代码示例中:

isCollision(x, y, x2, y2);

            if (isCollision(x, y, x2, y2) == true) // if loop that I am messing up somehow
            }
                Warning.Clear(sf::Color::White);

            }

为什么要调用该函数isCollision两次?

你可以这样做:

bool is_coll = isCollision(x, y, x2, y2);
if(is_coll) {
//....
}

而且brace }后面的if语句看起来不匹配....

此外,在函数的实现中isCollision,什么是abs(x2 - x)

我觉得abs()可能是一个宏,所以检查宏是否定义正确?语句中的两个宏调用if()真的会把事情搞砸。

于 2011-08-09T07:12:35.980 回答
1

我怀疑RenderWindow构造函数创建并显示了窗口。
在发生碰撞之前,您不应该创建它(或至少延迟显示它)。
我将把它作为一个练习让你弄清楚如何完成它。

于 2011-08-09T10:24:03.153 回答
1

尝试使用更简单的方法来找出错误的确切位置。molbdnilo 可能是对的,所以与其使用新窗口来检查您的碰撞代码是否正确,您可以做一些肯定会起作用的事情。我通常只用 cout 输出消息:

#include <iostream>

            if (isCollision(x, y, x2, y2) == true)
        {
            cout << "squares r colliding!!!";
            Warning.Clear(sf::Color::White);

        }

只需确保您可以看到控制台(有时您需要为此使用调试模式)

也没有 if 循环;)

于 2014-05-03T10:24:36.920 回答
1

在 C++ 中,由调用者来收集返回值。

isCollision(x, y, x2, y2);

现在对上述函数的调用没有任何用处。您需要收集返回值并将其用作 if 条件的标志。或者直接将函数调用放在 if 条件本身中。

if ( isCollision(x, y, x2, y2) ){

   // Code here
}
于 2011-08-09T05:19:08.597 回答