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

ループが各衝突を2回検出するため、おそらく2回フリップするだけです。

反転するのではなく、実際にオブジェクトを互いに遠ざけるようにすることをお勧めします。そして最後に、壁から遠ざけるようにします。そうしないと、壁に直接衝突したときに、ボールが実際に外に移動してしまう可能性があります。

簡単な修正として、変更できます

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

に注意してくださいi+1。これは「のボール」です。

于 2012-05-11T07:19:40.487 に答える