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

标签 c++ visual-studio sfml

我目前正在尝试复制 frogger,并且正在为与水和原木相关的碰撞检测而苦苦挣扎。

我可以拥有它,如果 Frog 跳到木头上,它会随木头一起携带,我也可以让 Frog 在与水碰撞时重生,但我不能同时拥有两者。当我尝试时,它只会让水碰撞超过其他任何东西。

这可能是因为水是一个大矩形,上面的原木是较小的矩形,但是原木的大小和运动使得 Frog 平坐在原木上。

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

最佳答案

你的逻辑有点问题。当然,如果 if 语句的第一部分触发,那么第二部分将没有机会激活。但是,您为每个日志运行该片段。除非你的 Frog 与每根原木相交,否则它每次都会重生。

你需要的是这样的:

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 个日志相交,那么您将被宣布为安全。如果没有,请飞溅。

关于具有重叠矩形的 C++ 碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49587529/

相关文章:

c++ - SFML SoundBuffer 到音乐缓冲区

C++成员函数虚覆盖和同时重载

c++ - 如何在 C++ 中生成由负值和正值组成的范围内的随机数?

.net - TabPages 中的工具条经常从 Windows 窗体设计器中消失

visual-studio - Visual Studio 2017 状态栏中带有向下箭头的图标 - 这是什么意思?

c++ - 是否可以从 SFML 中的音频样本中拆分左右声道?

c++ - 给定噪声分布,用噪声破坏图像?

c++ - 枚举基类型的模板优化

visual-studio - 加载配置文件时出错 : Failed to start monitoring changes because the network BIOS command limit has been reached

c++ - 找不到 MSVCP110D.dll