我打算给出一个深入的答案,但这篇文章的公认答案几乎总结了我要说的内容。这是人们第一次尝试基本碰撞检测时遇到的常见问题。这个问题的解决方案比你想象的要复杂,它们基本上围绕着计算物体在碰撞点的位置。
编辑:要弄清楚两个物体碰撞的确切时间,您可以执行以下操作:(未测试)
onCollide(obj1, obj2)
{
t = 0; //parametric value to store when objects first collided
// calculate when the obj1's left side collides with obj2's right side
// parametric equation is obj1.left + obj1.vel.x * t = obj2.right + obj2.vel.x * t
// solving for t: t = (obj1.left - obj2.right) / (obj2.vel.x - obj1.vel.x)
// we take the minimum because that is when the first sides collided
t = math.min(t, (obj1.left - obj2.right) / (obj2.vel.x - obj1.vel.x))
t = math.min(t, (obj1.right - obj2.left) / (obj2.vel.x - obj1.vel.x))// repeat for other sides
t = math.min(t, (obj1.top - obj2.bottom) / (obj2.vel.y - obj1.vel.y))
t = math.min(t, (obj1.bottom - obj2.top) / (obj2.vel.y - obj1.vel.y))
}
如果需要,您可以利用这段时间倒回整个模拟。或者您可以只查看这两个对象的状态。除了使用 min 函数,您还可以使用 if 语句并跟踪哪两个边首先发生碰撞。请记住,此计算不会跟踪在该时间步可能发生碰撞的多个对象,但通常这是一个有效的近似值。还要记住,当两个物体在一个维度上以相同的速度行进而不是另一个维度时,您应该避免除以零。