计算碰撞,考虑速度

时间:2016-10-30 15:12:06

标签: java libgdx game-physics

我正在制作一个平台游戏。跳跃和运动正在发挥作用,现在我想对碰撞进行编程。我对如何运作有一些想法:

我不确定这个问题是在这里还是在游戏开发网站上。

  1. 我有两个Vector2& - velo和动量(velo是速度)。两者都是(0,0)。动量是每帧加速度的动力。

  2. 每一帧,我首先得到输入。根据按下的键增加和/或增加动量(例如:if (Gdx.input.isKeyPressed(Keys.A)) { momentum.x -= speed; }

  3. 然后我将动量乘以0.15。这是为了减慢速度。

  4. 在此之后,我将速度乘以0.8。

  5. 然后,我将动量添加到速度,以增加速度,如 这就是实际移动玩家的原因。

  6. 然后我将速度添加到玩家的位置。

  7. 为了应用重力,我将重力矢量(0,-10)添加到玩家的位置。

  8. 所以我需要找到一种移动玩家的方法,但不要让它与世界任何地方重叠。世界由许多Rectangle个实例组成。玩家的身体也是Rectangle的一个实例。使用Box2D重写碰撞会更容易吗?我尝试过的是检查玩家移动时是否重叠任何矩形,如果是,则不移动它。
    但是,这似乎并没有考虑到所有因素 - 有时它会起作用,但有时候,它会在触及世界之前停止。

    TL; DR:我想让我的玩家与一个存储为矩形网格的世界发生碰撞。我怎么做,因为我的播放器也是一个矩形。使用Box2D会更容易吗?

1 个答案:

答案 0 :(得分:0)

这个答案很好地概述了碰撞检测的细节: https://gamedev.stackexchange.com/a/26506

但是,如果你只想进行简单的游戏,那可能会有点压倒性的。您的游戏循环是在固定的时间间隔内发生还是取决于帧速率?也许你可以通过简单地将碰撞检测分成更多步骤来解决问题的一部分。在一次更新期间,您可以进行10次小更新,每次只移动距离的十分之一,而不是完全移动。然后,您在每个步骤后进行碰撞检查,因此您不太可能过早停止或穿过薄物体。

这当然会对性能产生更多的负担,但它是一种天真且易于实施的解决方案。

编辑: 只需将位置更新包装在for循环中。我不知道您的代码是如何进行冲突检查和更新的,但一般结构类似于

for (int i = 0; i < 10; i++) {
    newPosX += deltaX * 0.1; // 1/10th of the usual update
    newPosY += deltaY * 0.1; // 1/10th of the usual update
    if (checkCollision(newPosX, newPosY))
    {
        posX = newPosX;
        posY = newPosY;
    }
    else
    {
        break; // We hit something, no more mini-updates necessary.
    }
}