【问题标题】:Calculating collisions, taking into account velocity计算碰撞,考虑速度
【发布时间】:2016-10-30 15:12:05
【问题描述】:

我正在制作一款平台游戏。跳跃和运动正在起作用,现在我想对碰撞进行编程。我对这将如何工作有一种想法:

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

  1. 我有两个 Vector2 - 速度和动量(速度是速度)。两者都是 (0, 0)。动量是每帧添加到速度的因素。

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

  3. 然后我将动量乘以 0.15。这是为了让它变慢。

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

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

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

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

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

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

【问题讨论】:

  • 我会将其移至游戏开发网站。我还建议学习一些物理知识。
  • @duffymo 我如何将其移至游戏开发网站?而且,我很确定我对此有足够的物理学知识,但是,也许不是
  • 看了你的问题后我会拒绝。

标签: java libgdx game-physics


【解决方案1】:

这个答案很好地概述了碰撞检测的细节: 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.
    }
}

【讨论】:

  • 我将如何进行这 10 个小更新?目前我只是在每帧移动角色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 2012-01-15
相关资源
最近更新 更多