java - 在两个 Sprite 碰撞之前获得最后一个双倍

标签 java double sprite collision intersection

我需要这样做,以便当我创建的 Sprite 与每个(我已经计算出碰撞)其他 Sprite 发生碰撞时,它们会传送到碰撞前它们所在的最后一个 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);
}

但是它不起作用,因为所有 Sprite 都在彼此内部。我也尝试过使用这个。

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

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

最佳答案

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

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

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

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

关于java - 在两个 Sprite 碰撞之前获得最后一个双倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16245258/

相关文章:

java - 列不能为空无法插入

java - 为什么 double 到 int 转换在 java 中不能按预期工作?

c++ - C++中的浮点变量

Sprite 之间的 C++ SDL 碰撞

java.lang.AbstractMethodError : org. apache.xerces.jaxp.DocumentBuilderFactoryImpl 不继承抽象 javax.xml.parsers.DocumentBuilderFactory

java - AdapterView 不支持 addView(View, LayoutParams)(不在 ListView 标签内添加内容)

ios - SpriteKit 纹理 "scaling"彼此不同

unity3d - 如何在Unity3d中删除切片的 Sprite

当分隔符具有单引号时,Java String split() 函数无法按预期工作

c# - Math.Abs​​(x) < double.Epsilon 是否等同于 Math.Abs​​(x) == 0d?