我正在写一个自上而下的2D XNA游戏。自从我第一次上学以来,我一直在尝试自己编写物理学和碰撞学知识。
每当我的玩家精灵角色试图移动到其边界与墙的边缘相交的位置时,我都会计算出反弹角(入射角=反射角),并让玩家反弹出墙并避免碰撞。
我很难弄清楚如何处理我的精灵同时与两个墙边相交的情况,尽管它碰到了一个角落。
我的代码当前告诉我,两个墙的边缘已经相交,但是没有碰到哪个边缘,因此没有反弹。
选择哪个边缘反弹的数学测试是什么?看到它的时候很简单,但是我正在努力寻找它的数学测试。
我正在写一个自上而下的2D XNA游戏。自从我第一次上学以来,我一直在尝试自己编写物理学和碰撞学知识。
每当我的玩家精灵角色试图移动到其边界与墙的边缘相交的位置时,我都会计算出反弹角(入射角=反射角),并让玩家反弹出墙并避免碰撞。
我很难弄清楚如何处理我的精灵同时与两个墙边相交的情况,尽管它碰到了一个角落。
我的代码当前告诉我,两个墙的边缘已经相交,但是没有碰到哪个边缘,因此没有反弹。
选择哪个边缘反弹的数学测试是什么?看到它的时候很简单,但是我正在努力寻找它的数学测试。
Answers:
如果您计算已移动到的Wall
距离Player Sprite
,则可能可以基于相交的角的x和y坐标的增量。我希望这是有道理的,我想不出一种更好的措词方式。
因此,例如,如果您查看图表。就拿x
的左上角的值Player Sprite
(移动后),并减去x
的右下角的价值Wall
。对y
值做同样的事情,然后看哪个更大。关键是,如果一个大于另一个,则Player Sprite
可能在该侧相交。
这是一个图像示例(这是图像的一个小节,其中添加了我自己的行):
现在,您在这里看到蓝线大于绿线。在这种情况下,蓝线也在Player Sprite
预期会反弹的一侧。
如果两个值相等,则它们将在角上。
现在,以这种方式进行操作存在一个小问题。如果Player Sprite
行进速度非常快或碰撞非常靠近拐角处,则行进路线Player Sprite
可能会Wall
沿错误的方向进一步向行进。在这种情况下,您可能必须检查移动物体的速度。(请参阅内森·里德的答案。)
注意:我想我实际上是在描述@Blau提到的SAT碰撞检测,但是我花了很长时间写了这篇文章,所以无论如何我都要发布它。希望它将对您有所帮助。
最小排量 不能总是给出其优势是先打正确的答案。考虑这种情况:
当速度足够高以致块在一帧中移动得很远时,就会发生这种情况。为了正确检测首先撞到哪个边缘,您需要建立一个线性方程来求解与每个边缘的碰撞时间。在OP的图表中描述的这种情况下,相关方程为:
timeXCollision = (player.left - wall.right) / -player.velocity.x
timeYCollision = (wall.bottom - player.top) / player.velocity.y
(这是假设X轴为X轴,Y轴为Y轴的坐标系。)通常,您必须使用player.velocity的X和Y分量来确定需要测试的一对边缘。无论如何,一旦计算出碰撞时间,这两者中的较早者就是您需要处理的碰撞。