乒乓物理问题

时间:2011-04-02 21:28:09

标签: c++ math physics sfml

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

Pong Physics Graphic

在检测到碰撞时,您可以看到球弹跳。没关系角度 - 我刚刚那样画了。 但有时球会通过桨而离开它。

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

也许其他想法?

5 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分:10)

许多事情可能导致问题。

值得注意的是,如果球每个“滴答”或“帧”可以移动多个像素,那么在检测到碰撞时它可能会与划桨相交几个像素。

然后通过改变其速度反转球从球拍上反弹,但是根据新的角度,球可能需要几帧才能完全离开球拍。所以,在下一个刻度线上,它仍然相交,你再次逆转速度 。这种情况的发生很可能会导致球最终离开其他侧的球拍,似乎直接飞过。

首次检测到交叉点时,您可能希望在该球拍组合上放置“暂时不碰撞”标记。

作为一个相关的问题,如果球足够快(特别是当它的x - 组件最高时,就像球几乎完全水平行进一样,那么它的桨最少事实上,实际上可能没有球与桨在物理上交叉的框架。

这完全取决于您的代码,我们无法看到。希望上面的内容应该给你一些想法。

答案 2 :(得分:0)

你真棒的图画告诉我你没有发现垂直碰撞。您应该对y坐标的x坐标执行相同的操作。

答案 3 :(得分:0)

这通常是由球的过快移动引起的。在一个框架移动到墙壁和下一个框架的情况下,它已经放置在墙壁后面。 Rhe碰撞不会发生。你可以通过进一步观察球轨迹和检查障碍来否定这一点。

答案 4 :(得分:0)

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