(2d方格碰撞检测)物体在发生卡顿时会分开移动

时间:2019-03-14 03:21:10

标签: c++ 2d collision-detection game-physics collision

我到处都在寻找一些有关碰撞检测的技巧,但是我似乎真的找不到任何对我有意义或对我有用的东西。我知道如何检测两个正方形是否发生碰撞,但是我不了解如何用重力正确地分离它们以及对它们不适用该怎么做。

if (tile->position.x < other->position.x + Tile::size && tile->position.x + Tile::size > other->position.x &&
            tile->position.y < other->position.y + Tile::size && tile->position.y + Tile::size > other->position.y) {

            glm::vec3 tCenter = tile->getCenter();
            glm::vec3 oCenter = other->getCenter();

            glm::vec3 dir = tCenter - oCenter;

            dir.x = dir.x / (Tile::size / 2.0f);
            dir.y = dir.y / (Tile::size / 2.0f);

            tile->position += dir;
            tile->velocity *= 0.0f;
        }

因此,基本上,如果发生碰撞,则将它们分开。在网上阅读了几本书之后,我想到了这种方法。这是超级接近,但我似乎无法理解某些口吃。

https://youtu.be/3NJMPDphy3A

有人知道我在想什么吗?或者你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

视频看起来不错!这更多是一个建议,但评论太久了。

此代码之外没有任何轮换或其他奇特的东西,对吗?只是重力,运动和某些范围会检查y = 0(地面)还是类似的物体?

您移动每个正方形的距离与正方形之间的距离成比例似乎有点奇怪。然后,正方形彼此直接重叠甚至不会移动。您可以在视频中的几个地方看到它。

您会尝试一下,让我知道是否有所改善?

代替此:

dir.x = dir.x / (Tile::size / 2.0f);
dir.y = dir.y / (Tile::size / 2.0f);

tile->position += dir;

尝试一下:

float dmax = max(abs(dir.x), abs(dir.y));
float scaleFactor = Tile::size / dmax;

dir.x *= scaleFactor;
dir.y *= scaleFactor;

tile->position = other->position + dir;

并保持

tile->velocity *= 0.0f;

我实际上并不了解C ++,但是我认为上面的代码是有效的。我希望这会有所帮助。