我正在制作Breakout / brick-breaker / arkanoid克隆(opengl-es / android),并且在碰撞检测代码上停留了很长时间。就像标题所暗示的:我如何确定砖的最下面已经被球击中了?

因为我只需要在某个方向上反转x或y的速度,所以当碰到一块砖时,我会想到:

 if(speedY < 0) : left, upper or right
 else : left, bottom or right
 if(speedX < 0) : bottom, right or upper
 else : bottom, left or upper


但是,这并不能使我确定它是垂直还是水平碰撞,因此,我应该将球发送到下一个方向。

我在互联网上看过一些代码示例,但是对于我来说,这些示例通常非常模糊,复杂或离题。

最佳答案

好吧,如果您知道积木的位置和球的位置,则可以对每个对象进行测试以确定积木的侧面。

假设标准Java起源在左上方:

   +----+
( )|    |
   +----+


如果球的最大X值小于砖的最小X值,则您必须知道球必须在左侧,反之亦然。您还将测试顶部和底部碰撞的Y值。

当然,这假设您首先要进行碰撞检测。



编辑



这是我的Collision引擎的摘录,这只是一个例子,但这是我测试对象是否在与其碰撞的事物的左侧的方法。

else if ((oCenter.getX() < sCenter.getX())
        && ((oCenter.getY() < (sCenter.getY() + sourceHalfHeight))
        && (oCenter.getY() > (sCenter.getY() - sourceHalfHeight))))
    return LEFT;


在我的示例中,oCenterPoint2D,它是球的中心。 sCenterPoint2D,它是矩形的中心。 sourceHalfHeight是矩形(具有中心点sCenter的对象)的高度的一半。

伪代码算法:

if (the center X of the ball < the center X of the rectangle
        AND the center Y of the ball is BETWEEN the max Y and min Y of the rectangle)
    then the ball is to the LEFT of the rectangle
end if

10-08 02:27