现在,我可以比较 X 和 Y 来检查碰撞,但前提是这两个对象在完全相同的 X 和 Y 位置上相互穿过。我需要更精确地检查碰撞,检查是否有脱脂,因为没有更好的术语。我有 X、Y、X 和 Y 比例的变量以及 X 和 Y 的速度。非常感谢任何帮助:D
编辑:正方形!!!
现在,我可以比较 X 和 Y 来检查碰撞,但前提是这两个对象在完全相同的 X 和 Y 位置上相互穿过。我需要更精确地检查碰撞,检查是否有脱脂,因为没有更好的术语。我有 X、Y、X 和 Y 比例的变量以及 X 和 Y 的速度。非常感谢任何帮助:D
编辑:正方形!!!
如果你的正方形不能旋转,这很容易:比如double r
每条边的长度,Point p1
一个正方形的中心,另一个正方形的中心p2
。然后:
if (Math.abs(p1.x - p2.x) < r && Math.abs(p1.y - p2.y) < r) {
// Collision
}
更复杂的情况是正方形是否可以旋转。在这种情况下:将对象的每个边缘视为几何线(如果您知道角的坐标,则可以轻松计算每条线的方程)。
接下来,找到每两条线的交汇点(每一条线从一个正方形到另一条线),并测试该点是否在其中一个正方形内。如果其中一个比较返回 true - 发生了冲突。
如果矩形可以旋转,你所要做的就是改变你的坐标系,使它们中的一个是轴对齐的,然后检查另一个的每个顶点,看看它(顶点)是否在轴对齐的内部长方形。您可以通过围绕同一点旋转两个矩形的所有顶点来更改坐标系。这个旋转的角度应该是旋转矩形的旋转角度的否定。例如,如果一个矩形倾斜 13°,您将围绕同一点将两个矩形的顶点旋转 -13°。
Elist 是/是一个巨大的帮助!然而,我发现这在我的第一个正方形周围创建了一个大正方形并弄乱了碰撞。这是我基于 Elist 帖子的实现。
public boolean colliding(Square os)
{
// the lesser value is the distance of the square's width and that of the lenght of the
// other square
return Math.abs(center.x - os.center.x) < width / 2 + os.width / 2
&& Math.abs(center.y - os.center.y) < height / 2 + os.width / 2;
}
所有对 Elist 应有的尊重,如果没有他们的帖子,我不会得出这个结论。
对那些感兴趣的人来说,额外的帮助是一个可以停止传入方块的处理程序,以及一个根据其他方块速度反映它的处理程序。
// stops the square from intersecting
public void push_collided_basic(Square os, float refelct_amnt)
{
if(os.center.x < center.x)
os.center.x -= refelct_amnt;
else if(os.center.x > center.x)
os.center.x += refelct_amnt;
if(os.center.y < center.y)
os.center.y -= refelct_amnt;
else if(os.center.y > center.y)
os.center.y += refelct_amnt;
}
// and now one that reflects the ball -> untested!!!
public void push_collided_velocity(Square os)
{
// flip the velocitys directions for x
if(os.center.x < center.x
|| os.center.x > center.x)
os.vel_x *= -1;
// flip the velocity direction for y
if(os.center.y < center.y
|| os.center.y > center.y)
os.vel_y *= -1;
// update the coordiantes
os.center.x += vel_x;
os.center.y += vel_y;
}