砖和球之间的碰撞检测(breakout,brick breaker)?

Collision detection between brick and ball (breakout, brick breaker)?

我正在使用 JavaFX (FXGL) 开发一款打砖块游戏。碰撞检测是这样工作的: 砖块和玩家在游戏世界中有一个 x、y 位置(放置在 LEFT,TOP)。 当检测到碰撞时(这是由引擎完成的),我使用 x、y 位置来检测球与砖块碰撞的位置,以计算下一个方向。球的方向由具有 (x, y) 速度的速度矢量创建。 collisionLogicSecurityPadding 是添加的小填充,因为仅在框内检测到碰撞。 (不可能得到球和砖块完全在同一个x,y坐标)

if (ball.getX() > levelBrick.getX() - ball.getWidth() + collisionLogicSecurityPadding &&
    ball.getX() < levelBrick.getX() + levelBrick.getWidth() - collisionLogicSecurityPadding) {
    //velocity.getX(), -velocity.getY()
} else {
    //-velocity.getX(), velocity.getY()
}

所以我用它的 x 位置测量球是否在砖块内。如果是这种情况,则碰撞是 TOP 或 BOTTOM。如果不是 RIGHT 或 LEFT。

然而,当球击中边缘附近时,这会导致问题检测错误。这里有一个短片:https://i.imgur.com/U8ybhRl.mp4

问题是 x 小于它认为是 TOP 或 BOTTOM 的区域,因此它正在切换导致问题的 X 方向。

我的问题是如何避免这种情况?有什么办法可以解决它正常工作的碰撞吗?当我在网上查找时,大多数教程只检查顶部或底部碰撞。

据我了解你的问题,在我看来你的问题是红框在边缘弹跳后走向错误的方向。

我认为您需要在三个实例中检测碰撞。

  1. Top/Bottom
  2. Left/Right
  3. 一条边

如果碰撞发生在边缘,您需要在与之前相同的 x 方向上发送它,并降低它在 y 方向上的速度。 y 速度应始终小于初始速度,并且与之前的方向相同。

我认为以上可以解决您的问题。

我认为您可以将 TOP、BOTTOM、LEFT、RIGHT 碰撞的检测更改为相对于球发生碰撞的位置。假设保持动量,您只需要否定 X 或 Y 速度。

在上面的示例中,球显然会在其质心的顶部和左侧产生碰撞。因此,不可能产生会产生您描述的行为的 RIGHT 碰撞。这留下了问题,您还不知道它是在左侧还是在顶部发生碰撞。但是由于 Vector 指向 RIGHT(正 X 轴运动),因此不可能在 LEFT 上产生碰撞。碰撞一定发生在顶部,因此 Y 速度需要乘以 -1。

只要球是唯一移动的物体,此方法就不会产生奇怪的行为。一旦你有一个物体比球移动得更快,你需要额外的检查:一个物体在它的左边击中球,而它已经在向右的一般运动中将增加 X 速度。