C++ C++;基于重叠矩形的碰撞检测

C++ C++;基于重叠矩形的碰撞检测,c++,visual-studio,sfml,C++,Visual Studio,Sfml,我目前正在尝试复制蛙人,并且正在努力进行与水和原木相关的碰撞检测 如果青蛙跳到原木上,我可以让它和原木一起跳,如果青蛙与水相撞,我也可以让它重生,但我不能两者兼得。当我尝试的时候,水的碰撞比其他任何事情都重要 这可能是因为水是一个大长方形,上面的原木是较小的长方形,但原木的大小和运动使青蛙坐在原木上 for (size_t i = 0; i < viLogS.size(); i++) { if (viLogS[i].getGlobalBounds()

我目前正在尝试复制蛙人,并且正在努力进行与水和原木相关的碰撞检测

如果青蛙跳到原木上,我可以让它和原木一起跳,如果青蛙与水相撞,我也可以让它重生,但我不能两者兼得。当我尝试的时候,水的碰撞比其他任何事情都重要

这可能是因为水是一个大长方形,上面的原木是较小的长方形,但原木的大小和运动使青蛙坐在原木上

for (size_t i = 0; i < viLogS.size(); i++)
        {
            if (viLogS[i].getGlobalBounds().intersects(player.getGlobalBounds()))
            {
                player.move(-2, 0); //if frog and log intersect move frog along same axis and speed as log 
            }
            else if (waterzone.waterRectangle.getGlobalBounds().intersects(player.getGlobalBounds()))
            {
                player.FrogRespawn();
            }
        }
for(size_t i=0;i > p>你没有显示如何计算碰撞,但最有可能的是,如果青蛙与这两个碰撞(这是一个选项),你总是认为它只与日志碰撞。至少你在发布的一小段代码中是这么说的。

你的逻辑有点缺陷。确定如果if语句的第一部分激发,那么第二部分将没有机会激活。但是,您可以为每个日志运行该代码段。除非你的青蛙与每一根木头相交,否则它每次都会重生

您需要的是:

if (waterzone.waterRectangle.getGlobalBounds().intersects(player.getGlobalBounds()))
{
    bool safe = false;
    for (size_t i = 0; i < viLogS.size(); i++)
    {
        if (viLogS[i].getGlobalBounds().intersects(player.getGlobalBounds()))
        {
            player.move(-2, 0); //if frog and log intersect move frog along same axis and speed as log
            safe = true;
        }
    }

    if (!safe)
    {
        player.FrogRespawn();
    }
}
if(waterzone.waterRectangle.getGlobalBounds().intersects(player.getGlobalBounds()))
{
bool-safe=false;
对于(size_t i=0;i

这会检查你是否在水域(我假设你也有陆地危险区域,如果没有,这可以简化),如果你只与一根圆木相交,那么你被宣布为安全。如果没有,则飞溅。

我想问题在于它是一个循环。也许试着把它分成两个循环,因为任何你不相交的日志都会自动给出else case->water collision。至少在我看来是这样。我赞同贝科的评论,你的问题似乎是,如果你至少有两块原木,青蛙就需要与这两块原木碰撞,才能不重生。你应该(例如)只检查循环中的日志是否发生冲突,如果青蛙没有与任何日志发生冲突,则更新一个布尔变量,该布尔变量为真,如果该布尔变量为真,并且青蛙与水发生碰撞,则重新启动。是的,你是对的,我可以在第一个日志上跳转,但一旦第二个日志生成,它就会跳转到water collision语句。
intersect
方法是否返回对相交矩形的引用(在这种情况下,它总是返回true,对于空矩形也返回true,您必须对此进行检查),或者是一个谓词,从这个意义上说,如果它相交,则表示
true
false
。矩形类是否有一个布尔类型,映射允许您检查是否为空?