【问题标题】:C++ Collision detection with overlapping rectangles具有重叠矩形的 C++ 碰撞检测
【发布时间】:2018-09-10 06:26:46
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我猜问题在于它是一个循环。也许试着把它分成两个循环,因为你不相交的任何日志都会自动给你 else case -> water collision。至少在我看来是这样。
  • 我同意 Beko 的评论,您的问题似乎是,如果您至少有两个原木,青蛙需要与这两个原木发生碰撞才能使其不重生。您应该(例如)只检查循环中与日志的碰撞并更新一个布尔变量,如果青蛙没有与任何日志碰撞,则该变量为真,然后如果该布尔变量为真并且青蛙与水相撞,则重新生成。
  • 是的,你是对的,我可以跳到第一根原木上,但是一旦第二根原木生成,它就会跳到水碰撞语句。
  • intersect 方法是否返回对相交矩形的引用(在这种情况下,它总是返回 true,对于空矩形也是如此——你必须检查这个)还是谓词,在感觉它说truefalse 如果它相交。矩形类是否有一个布尔类型的映射,可以让您检查是否为空?

标签: c++ visual-studio sfml


【解决方案1】:

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

你需要的是这样的:

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 根原木相交,那么您就被宣布为安全。如果没有,请泼水。

【讨论】:

    【解决方案2】:

    您没有展示如何计算碰撞,但最可能的情况是,如果青蛙与两者发生碰撞(这是一个选项),您始终认为它仅与日志发生碰撞。至少那是你在你发布的小 sn-p 代码中所说的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多