乒乓物理问题

zar*_*cel 18 c++ math physics sfml

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

乒乓物理图形

当你发现碰撞时你可以看到球弹跳.没关系角度 - 我刚刚那样画了.但有时球会穿过桨而离开它.

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

也许其他想法?

jef*_*yer 29

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

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


Lig*_*ica 10

许多事情可能导致问题.

值得注意的是,如果球每个"刻度"或"帧"可以行进多于一个像素,则在检测到碰撞时它可以与桨叶相交更多的像素.

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

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

作为一个相关的问题,如果球的速度足够快(特别是当它x的组件最高时,就像球几乎完全水平行进,所以桨的最小部分通过),可能在事实上,没有球与球在物理上相交的球.

这一切都取决于您的代码,我们无法看到.但是,希望上面的内容可以给你一些想法.

  • "不要碰撞一段时间"标志可以作为简单的状态机来处理.当检测到碰撞时,如果处于正常状态,则应用反弹并转换到"碰撞"状态.在处于碰撞状态时,不要应用任何弹跳 - 只是保持在碰撞状态,直到不再检测到碰撞,然后转换回正常状态.效果 - 反弹只能在至少一帧非碰撞后重复. (4认同)
  • 从理论上讲,球永远不会连续两次击中相同的桨/墙,对吧?因此,如果保存它所击中的最后一个对象,则可以忽略对同一对象的后续命中. (3认同)