C++ 利用C+的简单碰撞问题+;和sfml

C++ 利用C+的简单碰撞问题+;和sfml,c++,collision-detection,sfml,C++,Collision Detection,Sfml,我编写了一个简单的程序,屏幕上有两个立方体,一个用户可以移动,另一个是静止的。我刚开始使用sfml,从未接触过碰撞,所以这对我来说是全新的。在我的代码中,我的目标是在用户将多维数据集导入静止的多维数据集时弹出一个警告窗口。然而,问题是,一旦启动程序,警告窗口就会出现,即使它处于if循环中。这是我的密码: #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <iost

我编写了一个简单的程序,屏幕上有两个立方体,一个用户可以移动,另一个是静止的。我刚开始使用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;
    }
#包括
#包括
#包括
使用名称空间std;
bool-isCollision(intx,inty,intx2,inty2){//借用的函数,所有的积分都归曾经制作过它的人
如果(abs(x2-x)>20 | | abs(y2-y)>20)
返回false;
其他的
返回true;
}
int main()
{
sf::RenderWindow应用程序(sf::VideoMode(80060032),“我的SFML窗口”);
渲染窗口警告(sf::视频模式(40022532),“警告!”);
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);
而(App.IsOpened())
{
sf::事件;
while(App.GetEvent(event))//我现在知道了处理事件的较短方法,只是还没有编辑它。没有功能上的区别
{
如果(event.Type==sf::event::Closed)
App.Close();
if((event.Type==sf::event::KeyPressed)&&&(event.Key.Code==sf::Key::Escape))
App.Close();
如果((event.Type==sf::event::KeyPressed)&&&(event.Key.Code==sf::Key::Right))
直线移动(5.0,0);
如果((event.Type==sf::event::KeyPressed)&&(event.Key.Code==sf::Key::Left))
直线移动(-5.0,0);
如果((event.Type==sf::event::KeyPressed)&&(event.Key.Code==sf::Key::Down))
直线移动(0,5.0);
如果((event.Type==sf::event::KeyPressed)&&(event.Key.Code==sf::Key::Up))
直线移动(0,-5.0);
}
int x=Rect.GetPosition().x;
int y=Rect.GetPosition().y;
int x2=Rect2.GetPosition().x;
int y2=Rect2.GetPosition().y;
融合(x,y,x2,y2);
if(isCollision(x,y,x2,y2)==true)//如果我搞砸了循环
}
警告。清晰(sf::颜色::白色);
}
App.Clear();
应用绘图(矩形);
附图(2);
App.Display();
}
返回退出成功;
}

我从一个我正在观看的图坦卡蒙那里得到了bool isCollision函数,但是图坦卡蒙是在快板中完成的,所以我尽我所能从中获取。(我在使用他的函数时的逻辑是,我们的立方体大小完全相同,并且它们的性质相同[一个移动一个静止]。问题是,我想,在我如何调用函数时。任何和所有帮助都非常感谢。

< P> C++,它是由调用方收集返回值。

isCollision(x, y, x2, y2);
现在对上述函数的调用没有任何用处。您需要收集返回值并将其用作if条件的标志。或者直接将函数调用放入if条件本身

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

   // Code here
}

<>在C++中,调用方收集返回值。< /P>
isCollision(x, y, x2, y2);
现在对上述函数的调用没有任何用处。您需要收集返回值并将其用作if条件的标志。或者直接将函数调用放入if条件本身

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

   // Code here
}

我认为您的函数返回不正确,您应该这样尝试。(仅供参考2返回是非常糟糕的做法)


希望这有帮助:D

我认为您的函数返回不正确,您应该这样尝试。(仅供参考2返回是非常糟糕的做法)

希望这对您的代码示例有帮助:D

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()
语句中的两个宏调用确实会把事情搞砸。

在代码示例中:

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()
语句中的两个宏调用确实会把事情搞砸。

我怀疑
RenderWindow
构造函数创建并显示了窗口。
在发生冲突之前,不应创建它(或至少延迟显示它)。

我将把它作为一个练习留给您,让您找出如何实现它。

我怀疑
RenderWindow
构造函数创建并显示了窗口。
在发生冲突之前,不应创建它(或至少延迟显示它)。

我将把它作为一个练习留给您,让您找出如何做到这一点。

尝试使用一种更简单的方法来找出错误的确切位置。molbdnilo可能是正确的,因此,您可以做一些肯定有效的事情,而不是使用新窗口检查冲突代码是否正确。我通常只输出消息w第四法庭:

#include <iostream>

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

        }
#包括
如果(isCollision(x,y,x2,y2)=真)
{

试着用一种更简单的方法来找出错误的确切位置。molbdnilo可能是对的,所以不要用usi