我正在制作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;
在我的示例中,
oCenter
是Point2D
,它是球的中心。 sCenter
是Point2D
,它是矩形的中心。 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