0

我需要做到这一点,以便当我创建的精灵与每个精灵发生碰撞时(我已经弄清楚了碰撞),它们会传送到它们在碰撞之前所在的最后一个 x 和 y 位置,这样它们就不会通过每个其他。我曾尝试使用此代码。

double x, y, x2, y2;
if(!r1.intersects(r2)){
    x = z.getX();
    y = z.getY();
    x2 = z2.getX();
    y2 = z2.getY();
}
if(r1.intersects(r2)){
    z.setX(x);
    z.setY(y);
    z2.setX(x2);
    z2.setY(y2);
}

但它不起作用,因为所有的精灵都在彼此内部。我也试过用这个。

if(r1.intersects(r2)){
    z.setX(z.getX() - 1);
    z.setY(z.getY() - 1);
    z2.setX(z2.getX() + 1);
    z2.setY(z2.getY() + 1);
}

该代码使精灵不能相互穿过,但它会使产生的第一个精灵变得比后来的精灵快得多,因为一开始有更多的精灵相互碰撞。

4

1 回答 1

1

我假设这些精灵比简单的圆圈更复杂?我还假设您已经实现了一些“边界框”碰撞检测。

如果是这种情况,那么我会在检测到碰撞后计算一个向量。向量将是每个精灵相对于它们的中心点彼此相交的量级。然后,您可以沿向量沿相反方向移动每个精灵,按它们相交的距离进行缩放。这将定位每个精灵,使它们只是接触。

这是一个很好的解决方案,因为如果每个精灵每帧移动超过 1 个像素,则每个精灵的最后位置可能是 10 个像素的距离。看起来他们永远不会真的发生碰撞。

..这适用于复杂的精灵和简单的圆圈。

于 2013-04-26T21:42:53.070 回答