0

ゲームの作成に使用したい小さなライブラリがあります。まず、ピクセルパーフェクト衝突検出を実装しようとしましたが、うまくいかなかったので、単純なバウンディングボックス衝突検出を使用することにしました。正常に動作しますが、オブジェクトの数が約 20 を超えると、速度が低下し始めます。これが私のコードです:(ループで実行、毎秒25回)

for (int i=0;i<sc.collGr.size();i++){
    CollisionGroup gr=sc.collGr.get(i);
    Collidable[] cc=gr.getCollidables();
    for (int l=0;l<cc.length;l++){
        for (int w=l+1;w<cc.length;w++){
            if (BorderBox.areColliding(cc[l].getBorderBox(), cc[w].getBorderBox()){
                addEventToHandler(sc.collGr.get(i),cc[l],cc[w]);
            }
        }
   }
}

BorderBox クラスの一部:

public class BorderBox {
int top;
int down;
int left;
int right;

/**
 * Creates new BorderBox object
 * Arguments: (top, down, left, right);
 * */
public BorderBox(int topy,int downy, int leftx,int rightx){
    top=topy;
    down=downy;
    left=leftx;
    right=rightx;
}

/**
 * Checks if two provided BorderBoxes are colliding.
 * */
public static boolean areColliding(BorderBox a,BorderBox b){
    if (b.left<=a.right && b.right>=a.left && b.down>=a.top && b.top<=a.down){
        return true;
    }
    return false;
}
4

2 に答える 2

1

このようにチェックするのがO(n^2)操作です。つまり、新しいオブジェクトを追加すると、実行する作業量は2次式に増加します。

私が以前にこれを軽減した方法は、他の提案とともに、2つの異なる配列に2つのタイプの衝突可能なオブジェクトを配置することです。1つの配列には少数のオブジェクト、主にキャラクターがあり、もう1つの配列には敵がいます。敵同士の衝突は気にしないという考え方です。したがって、小さい配列の要素が大きい配列の要素と衝突するかどうかをチェックするだけで、実行する必要のある作業量を大幅に削減できます。

もちろんこれはゲーム固有のものであり、すべてが他のすべてと衝突する必要がある場合は機能しません。とはいえ、単純なゲームではそうではないことがよくあります。

于 2012-04-07T17:02:28.363 に答える
0

遠く離れたオブジェクトの衝突をチェックしないように、スペースを分割します。ゲームによっては、kd-Trees のようなより洗練されたものを使用して、単純なグリッドで行うことができます。実際の部屋があるゲームを作ったことがありますが、同じ部屋にあるオブジェクト間の衝突をチェックしました (オブジェクトよりも部屋が少ない、またはどのオブジェクトがどの部屋にあるかを更新するのは簡単であると仮定します)。

于 2012-04-07T16:31:20.770 に答える