0

我想从理论上尽可能地问这个问题。请忘记编程语言和 API。

假设我们有一个随键盘移动的正方形。在我们广场生活的屏幕中,也存在障碍。这个障碍是一个长方形,而且是实心的。这意味着,例如,如果我们的方块从左侧(障碍物的左侧)撞到它,方块将无法朝那个方向前进(就像一堵墙)。

这很简单,所以现在,我认为有两种主要方法可以解决这个问题。假设我们使用命中测试碰撞来检测它:

- 移动(帧之间有时间差),看看新的移动是否发生了碰撞。如果新动作发生碰撞,则“更正”击中的坐标(可能是 x 或 y)。

- 看看更新 x 是否会产生冲突。如果成功了,请不要更新 x(或在碰撞障碍物之前将其更新到最大值)。用 y 做同样的事情。

其实我用的是第二种方法,效果很好!首先,我尝试了第一种方法,但我发现它存在很大问题。当你在移动后发生碰撞时,这意味着我的玩家“进入”了障碍物。但是碰撞可能是由很多可能的方向引起的,那么我怎么知道哪个方向是我必须纠正坐标的正确方向呢?它可能做得很好,但是当我可以简单地选择第二种方式时,它会使代码复杂化。

我在 SDL 中这样做,第二种方法效果很好。

你怎么看?

4

2 回答 2

1

这确实取决于您希望碰撞有多复杂。如果您有适合自己的东西,请务必使用它!无论如何,重要的部分是在渲染之前解决冲突。;)

但实际上,投影路径以检查潜在碰撞与首先移动对象然后根据需要将它们移回并没有显着不同。这只是您如何看待它以及您的算法如何工作的区别。检查潜在的碰撞(移动前检查)意味着制作类似扫过的身体形状并检查与其他扫过的重叠,然后将对象移动到推断的最终位置。检查过去的碰撞(移动后检查)只是检查对象本身的重叠(并避免高速隧道)。

如果您需要解决许多对象之间的冲突,那么(在我看来)您应该在检查重叠之前移动所有内容。您必须保留旧的位置和速度,以便将对象向后滑动,直到它们不再重叠,然后相应地给它们适当的动量。您可能仍希望执行子步骤以将对象带到其最终位置。

总的来说,这些问题已经被一些非常好的库解决了。如果您需要良好的物理碰撞,请先尝试其中一种,然后再疯狂地制作自己的碰撞。

于 2014-12-27T02:47:38.360 回答
0

your way works fine for square obstacles, but for curved obstacles if you want to bounce off them you need to calculate the angle of the sirface where the collision happened. take snooker games for example.

If collisions are rare it may make sense to move first and check for collisions and if there is a collision undo the move and then look for details of the cause of the collision.

于 2014-12-26T22:17:13.233 回答