1

目前我有代码可以检测2个矩形的碰撞,r1.overlaps(r2)但我真的不知道如何让矩形简单地碰撞并停止移动(理论上每个人都有相同的力量)目前我已经玩过一站的组合,反转,或两者兼而有之,但结果总是有问题(无论矩形是慢慢变形还是只是结块并停止移动)。

这是我的碰撞声明(它们有效)

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;
4

2 回答 2

0

你考虑过box2d吗?这将使您在盒子碰撞时的“后坐力”更加真实。

如果您想自己动手,请考虑:

我假设你的 API 使用你的矩形是轴对齐的,所以碰撞定义了第三个矩形 C,其中 A 与 B 重叠。找到这个 C 的中心点,以及 A 和 B。你可以移动 A 的中心点,例如,向后沿着由中心点 A 和中心点 C 定义的线。对 B 执行相同操作。不过,您必须尝试向后移动多少。如果你移动直到 A 和 B 的边缘通过中心点 C,你应该不再有碰撞。

这是一个即兴的,相对简单的算法。如果您想要更真实的东西,我会说使用 box2d。

于 2013-09-13T23:59:33.577 回答
0

我敢打赌,问题在于 1.5 双倍数学是靠不住的。乘以 15 再除以 10,或者做 2 的幂。

于 2013-09-13T20:06:38.853 回答