【问题标题】:Simple collision problem utilizing C++ and sfml利用 C++ 和 sfml 的简单碰撞问题
【发布时间】:2011-10-22 22:13:54
【问题描述】:

我编写了一个简单的程序,屏幕上有两个立方体,一个用户可以移动,另一个是静止的。我刚开始使用 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 中完成的,所以我尽可能地从中获取。 (我使用他的函数的逻辑是我们的立方体大小完全相同,并且它们的属性相同[一个移动一个静止]。我认为问题必须在于我如何调用该函数。任何和所有的帮助都很大赞赏

【问题讨论】:

  • 如果你有一个} 而不是{ 是不是一个错字?

标签: c++ collision-detection sfml


【解决方案1】:

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

#include <iostream>

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

        }

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

也没有 if 循环 ;)

【讨论】:

  • 哇,刚刚注意到这个问题已经 3 岁了,哇哦:D
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在您的代码示例中:

    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) {
    //....
    }
    

    if 之后的 brace } 语句看起来不匹配....

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

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

    【讨论】:

      【解决方案4】:

      我认为你的函数没有正确返回,你应该这样尝试。 (仅供参考 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

      【讨论】:

        【解决方案5】:

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

        isCollision(x, y, x2, y2);
        

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

        if ( isCollision(x, y, x2, y2) ){
        
           // Code here
        }
        

        【讨论】:

          猜你喜欢
          • 2012-09-23
          • 2014-02-28
          • 2011-01-05
          • 2017-07-25
          • 2018-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-22
          相关资源
          最近更新 更多