如何使矩形之间的碰撞绕其中心旋转?

问题描述 投票:0回答:2

我有一个坦克游戏,我的坦克可以旋转,但我不能让它们和游戏对象发生碰撞

void Tank::ActionOnCollision(const sf::FloatRect &collided_object)
{
  const auto kTankGlobalBounds = sprite_.getGlobalBounds();
  const auto kTankOrigin = sprite_.getOrigin();
#pragma region Коллизия справа
  if (kTankGlobalBounds.left < collided_object.left
     && kTankGlobalBounds.left + kTankGlobalBounds.width < collided_object.left + collided_object.width
     && kTankGlobalBounds.top < collided_object.top + collided_object.height
     && kTankGlobalBounds.top + kTankGlobalBounds.height > collided_object.top)
  {
   sprite_.setPosition(collided_object.left - kTankGlobalBounds.width,
                  kTankGlobalBounds.top + kTankOrigin.y);
  }
#pragma endregion
#pragma region Коллизия слева
  else if (kTankGlobalBounds.left > collided_object.left
     && kTankGlobalBounds.left + kTankGlobalBounds.width > collided_object.left + collided_object.width
     && kTankGlobalBounds.top < collided_object.top + collided_object.height
     && kTankGlobalBounds.top + kTankGlobalBounds.height > collided_object.top)
  {
   sprite_.setPosition(collided_object.left + collided_object.width,
                  kTankGlobalBounds.top + kTankOrigin.y);
  }
#pragma endregion
#pragma region Коолизия снизу
  if (kTankGlobalBounds.top < collided_object.top
     && kTankGlobalBounds.top + kTankGlobalBounds.height
        < collided_object.top + collided_object.height
     && kTankGlobalBounds.left < collided_object.left + collided_object.width
     && kTankGlobalBounds.left + kTankGlobalBounds.width > collided_object.left)
  {
   sprite_.setPosition(kTankGlobalBounds.left + kTankOrigin.x,
                  collided_object.top - collided_object.height + kTankOrigin.y);
  }
#pragma endregion
#pragma region Коллизия сверху
  else if (kTankGlobalBounds.top > collided_object.top
     && kTankGlobalBounds.top + kTankGlobalBounds.height
        > collided_object.top + collided_object.height
     && kTankGlobalBounds.left < collided_object.left + collided_object.width
     && kTankGlobalBounds.left + kTankGlobalBounds.width > collided_object.left)
  {
   sprite_.setPosition(kTankGlobalBounds.left + kTankOrigin.x,
                  collided_object.top + kTankGlobalBounds.height + kTankOrigin.y);
  }
#pragma endregion
}

从上方和下方的碰撞有效,但只要坦克转动一点点,坦克就会停止碰撞

c++ sfml game-development
2个回答
1
投票

我建议使用一个好的开源 2D 物理库作为参考,并引入你需要的代码来进行特定的事情,比如两个旋转矩形之间的碰撞测试。或者实际集成和使用库。

Box2D我强烈推荐


0
投票

对于 2 个矩形,检查下面的每条边(有 8 条边)。

考虑用边缘所在的直线将世界分成两个区域。 这里,边所属的矩形完全包含在一个区域中。 检查另一个矩形是否完全包含在另一个区域中。 如果是这样,2 个矩形不相交(不碰撞)。

© www.soinside.com 2019 - 2024. All rights reserved.