18

我有问题,但我不知道如何描述它,所以我画了它。

乒乓物理图形

如您所见,当检测到碰撞时球会反弹。没关系 - 我只是这样画的。但有时球会穿过桨叶,以其他方式离开。

为什么会这样?因为当我检测到碰撞时,我将 vx 更改为 -vx。在这种情况下我该怎么办?也改变 y ? 但是如何检查桨球击中的哪一侧呢?

也许其他想法?

4

5 回答 5

29

对于编写 pong 克隆的人来说,这是一个很常见的问题。解决方案是,在检测到碰撞时,不仅要反转速度,还要改变球的位置,使其不与桨相交。

否则,球可能会卡在桨内,每帧不断否定 vx = -vx = vx = -vx。它不会离开桨,直到它的 y 动量将它向上或向下移动到足够远以逃脱。

于 2011-04-02T21:47:10.450 回答
10

许多事情可能会导致问题。

值得注意的是,如果球可以在每个“滴答”或“帧”中移动超过一个像素,则在检测到碰撞时,它可能与球拍相交更多像素。

然后,您可以通过改变球的速度将球从球拍上反向反弹,但根据新的角度,球可能需要几帧才能完全离开球拍。所以,在下一个滴答声中,它仍然相交,并且您再次反转速度。这种怪异的情况很可能导致球最终离开另一侧的桨,似乎直接飞过。

当第一次检测到交叉点时,您可能希望在该桨-球组合上放置“暂时不要碰撞”标志。

作为一个相关的问题,如果球跑得足够快(特别是当它的x-component 最高时,例如当球几乎完全水平行进时,因此它可以通过的桨最少),可能有事实上,没有球与球拍物理相交的框架。

这一切都取决于您的代码,我们看不到。不过,希望以上内容能给您一些想法。

于 2011-04-02T21:41:11.527 回答
0

这通常是由于球的移动过快造成的。其中一帧它正在移动到墙上,而下一帧它已经放置在墙后。只是没有发生碰撞。您可以通过沿着球的轨迹进一步观察并检查障碍物来否定它。

于 2011-04-02T21:37:02.687 回答
0

你很棒的图画告诉我你没有检测到垂直碰撞。您应该对 y 坐标执行与 x 坐标相同的操作。

于 2011-04-02T21:34:23.617 回答
0

我在打乒乓球时发现的一个解决方案是在检测到与左桨碰撞时使用 vx = abs(vx),当检测到与右桨碰撞时使用 vx = -abs(vx)。这确保了球只反弹一次,消除了由多次反弹引起的球拍内部的行程。

于 2017-08-13T18:03:11.810 回答