目前我的代码将使用r1.overlaps(r2)
检测2个矩形的碰撞,但我真的不知道如何使矩形简单地碰撞并停止移动(理论上每个人都有相同的力量)目前我玩过周围有一个停止,反向或两者的组合,但它总是变成越野车(矩形是否缓慢变形或只是结块并停止移动)。
这是我的碰撞声明(它们有效)
public static void checkCollisions() {
for(int i = 0; i < Map.enemies.size(); i++) {
for(int j = 0; j < Map.players.size(); j++) {
if(Map.enemies.get(i).body.overlaps(Map.players.get(j).body)) {
Map.players.get(j).hit = 1;
Map.enemies.get(i).hit = 0;
}
}
for(int j = 0; j < Map.enemies.size(); j++) {
if( i!= j && Map.enemies.get(i).body.overlaps(Map.enemies.get(j).body)) {
Map.enemies.get(j).hit = 0;
Map.enemies.get(i).hit = 0;
}
}
}
}
和移动方法(目前两者都相同.8方向移动完美无缺,直到我们添加碰撞并且框不会欣赏它。tick()
每次屏幕呈现时都会运行checkCollisions()
)
if(hit == 1) {
double MoveX = 0;
double MoveY = 0;
if(degree >90 && degree < 270) MoveX-=1;
if(degree < 90 || degree > 270) MoveX+=1;
if(degree > 0 && degree < 180) MoveY+=1;
if(degree > 180 && degree < 360) MoveY-=1;
if(MoveX == 0) MoveY *=1.5;
if(MoveY == 0) MoveX *=1.5;
x--;
y--;
}else if( hit == 0){
double MoveX = 0;
double MoveY = 0;
if(degree >90 && degree < 270) MoveX-=1;
if(degree < 90 || degree > 270) MoveX+=1;
if(degree > 0 && degree < 180) MoveY+=1;
if(degree > 180 && degree < 360) MoveY-=1;
if(MoveX == 0) MoveY *=1.5;
if(MoveY == 0) MoveX *=1.5;
x += MoveX;
y += MoveY;
}
hit = 0;
答案 0 :(得分:0)
我敢打赌,问题在于,1.5倍数学是不可思议的。乘以15除以10,或者以2的幂为单位。
答案 1 :(得分:0)
您是否考虑过box2d?这会让你在碰撞时的“反冲”中获得更多的真实感。
如果你想自己动手,请考虑:
我假设你的API使用你的矩形是轴对齐的,所以碰撞定义了第三个矩形C,其中A重叠B.找到这个C的中心点,以及A和B.你可以移动A的中心点,因为例如,沿着由中心点A和中心点C定义的线返回。对于B执行相同操作。但是,您必须尝试移回多少。如果移动直到A和B的边缘通过中心点C,则不应再发生碰撞。
这是一个关闭袖口,相对简单的算法。如果你想要更真实的东西,我会说用box2d。