C ++具有重叠矩形的碰撞检测

时间:2018-03-31 12:05:23

标签: c++ visual-studio sfml

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

我可以拥有它,如果青蛙跳上原木,它会随着木头一起携带,如果它与水碰撞,我也可以让青蛙重生,但我不能同时拥有它们。当我尝试它时,只需将水碰撞而不是其他任何东西。

这可能是因为水是一个大的矩形,顶部的日志是较小的矩形,但是原木的大小和运动使得青蛙在日志上齐平。

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();
            }
        }

2 个答案:

答案 0 :(得分:1)

您的逻辑略有缺陷。当然,如果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();
    }
}

这将检查您是否在水域中(我假设您的陆地区域也有陆地危险,如果不能简化,则可以简化),如果仅相交1根日志,则表示您是安全的。如果没有,请飞溅。

答案 1 :(得分:0)

你没有显示你如何计算碰撞,但最可能的是,如果青蛙与两者发生碰撞(这是一个选项),你总是认为它只与日志相撞。至少你在你发布的一小段代码中说了些什么。

相关问题