我正在制作一个突破/破砖/ 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
然而,这并没有让我在决定它是垂直还是水平碰撞方面做得很远,而且那个方向我应该接下来发球。
我已经在互联网上查看了一些代码示例,但这些代码通常对我来说非常模糊,复杂或偏离主题。
答案 0 :(得分:2)
好吧,如果您知道砖块的位置和球的位置,您可以对每个物体进行测试,以确定砖块的侧面。
假设左上角是标准的Java源:
+----+
( )| |
+----+
如果球的Max-X是&lt;砖的Min-X,你知道它必须在左侧,反之亦然在左侧。您还可以测试顶部和底部碰撞的Y
值。
当然,这假设您已经首先进行了碰撞检测。
修改强>
这是我的碰撞引擎的摘录,这只是一个例子,但这是我如何测试对象是否与它碰撞的东西的左边。
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
答案 1 :(得分:0)
问题是,你只能以速度知道它,因为球可以在两个不同的时间击中两个不同的侧面,两个时间在相同的方向上以相同的速度。
例: 第一条线击中顶部,第二条线击中侧面,但两者都具有相同的速度和方向
/
/ /
_____ /
|_____|
你必须使用球的位置并将其与砖的每一侧进行比较