0

我有一种方法可以将球反射到墙上,也可以相互反射。每个球的半径为 50。

public void reflectBalls(){
    for(int j = 0; j < 2; j++){
        if(ball[j].getY() <= NWall) ball[j].flipVertical();
        else if(ball[j].getY() >= (SWall - 50)) ball[j].flipVertical();
        else if(ball[j].getX() <= WWall) ball[j].flipHorizontal();
        else if(ball[j].getX() >= (EWall - 50)) ball[j].flipHorizontal();
    }
    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 2; j++){
            if(i == j){
                continue;
            }else{
                double ax = (double)ball[i].getX();
                double ay = (double)ball[i].getY();
                double bx = (double)ball[j].getX();
                double by = (double)ball[j].getY();
                double distx = (ax-bx)*(ax-bx);
                double disty = (ay-by)*(ay-by);
                double distance = Math.sqrt(distx + disty);
                if(Math.floor(distance) <= 100){
                    ball[i].flipHorizontal();
                    ball[j].flipVertical();
                    ball[i].flipVertical();
                    ball[j].flipHorizontal();
                }
            }
        }
    }
}

第一部分(对墙壁的反射)效果很好。但是,球不会碰撞;他们只是互相穿过。我尝试了许多不同的方法,但也许我缺少某种数学。我的算法基于勾股定理工作,其中 X 坐标之间的差异和 Y 坐标之间的差异都是平方的,它们的总和是中心之间的距离。

4

2 回答 2

1

这是您的问题-您发现球 i 与球 j 碰撞并且您将其翻转。然后你发现球 j 与球 i 碰撞并再次翻转它们。结果没有发生碰撞。仅在 j > i 时才执行碰撞检查,并且一切都应该没问题。

于 2012-05-11T07:18:57.623 回答
1

你可能只是翻转两次,因为你的循环会发现每个碰撞两次。

最好确保不是翻转,而是真正使对象彼此远离。最后,让他们远离墙壁。否则,在直接与墙壁发生碰撞时,您可能最终会得到一个实际上移动到外面的球!

作为快速修复,您可以更改

for(int j = i+1; j < 2; j++){

注意i+1. 这是“以后的球”。

于 2012-05-11T07:19:40.487 回答