检测移动物体和静止物体之间的碰撞

6

首先,我的问题并不特定于C#或XNA,但我的代码示例将使用它们。

我目前正在尝试制作一个Pong克隆,并遇到了与碰撞检测有关的问题。

每个对象基本上都有特定的速度(即Vector2),位置(也是Vector2)和速度(仅是float)。在每个对象的Update()调用中,位置会以以下方式更改:

Velocity.Normalize();
Position += Velocity * Speed;

起初,我只是通过两个对象的矩形简单地调用Intersects()来检查它们之间是否存在碰撞。但很快我意识到,我不能仅仅检查物体是否当前与另一个物体发生碰撞,而是要检查物体是否在其路径上与其他物体发生过碰撞。仅仅检查两个物体是否当前发生碰撞会导致当速度过高时,球穿过挡板。
我尝试了不同的方法来解决这个问题,但似乎都没有奏效。我只需要一种方法来检查两个对象是否在它们的路径上发生碰撞,如果发生碰撞,是水平、垂直还是两者都有(以相应地改变球的速度)。
我并不一定立即需要解决方案,也许只需要基本的实现思路,我会自己编码。
感谢您的时间。
5个回答

4

谢谢,我一定会看看的! :) - Jesse Emond


2

2

如果一个物体移动过快,它在Update()检测前就能穿过另一个静止的物体,您可能会遇到问题。

将对象的形状沿着移动向量延伸,大小为速度: 带有速度[1,0]和速度10的正方形[0,0][2,2]将创建一个矩形形状[0,0][12,2] => 现在位于坐标[0,0],大小为[12,2]

现在将矩形与静止对象相交,这样您就知道它们是否发生了碰撞。


这是一个聪明的解决方案,应该得到更多的赞赏。 - NappingRabbit

-1
如果两个点对象具有相同的位置,则它们已经发生了碰撞。

我认为事情并不是那么简单。很少有图形只有一个点的大小。 - Christopher B. Adkins
如果两个圆形对象的半径之和小于它们之间的距离,那么它们已经发生了碰撞。 - mcandre
我正在寻找一个解决方案,用于判断在它们的Update()调用期间,两个具有特定宽度和高度的对象是否发生了碰撞。 - Jesse Emond
1
想象一下你有一堵宽度为2个单位的墙壁和一个直径为1个单位的球。如果球距离墙壁2个单位,并且每帧移动6个单位,那么在下一次更新中,它的起始位置和结束位置都不会与墙壁“碰撞”,但是碰撞确实在球运动的部分路径上发生了。这就是XGhost27X所问的问题。 - FallenAvatar
比较每个像素似乎会增加很多额外开销。 - NappingRabbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接