Java中的矩形冲突以及如何正确使用它们?

时间:2013-09-13 19:47:11

标签: java libgdx physics

目前我的代码将使用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;

2 个答案:

答案 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。