我想从理论上尽可能地问这个问题。请忘记编程语言和 API。
假设我们有一个随键盘移动的正方形。在我们广场生活的屏幕中,也存在障碍。这个障碍是一个长方形,而且是实心的。这意味着,例如,如果我们的方块从左侧(障碍物的左侧)撞到它,方块将无法朝那个方向前进(就像一堵墙)。
这很简单,所以现在,我认为有两种主要方法可以解决这个问题。假设我们使用命中测试碰撞来检测它:
- 移动(帧之间有时间差),看看新的移动是否发生了碰撞。如果新动作发生碰撞,则“更正”击中的坐标(可能是 x 或 y)。
- 看看更新 x 是否会产生冲突。如果成功了,请不要更新 x(或在碰撞障碍物之前将其更新到最大值)。用 y 做同样的事情。
其实我用的是第二种方法,效果很好!首先,我尝试了第一种方法,但我发现它存在很大问题。当你在移动后发生碰撞时,这意味着我的玩家“进入”了障碍物。但是碰撞可能是由很多可能的方向引起的,那么我怎么知道哪个方向是我必须纠正坐标的正确方向呢?它可能做得很好,但是当我可以简单地选择第二种方式时,它会使代码复杂化。
我在 SDL 中这样做,第二种方法效果很好。
你怎么看?