1

同じオブジェクトを持つリスト内のオブジェクトをチェックする際に問題があります。弾丸、敵、ランダムな背景オブジェクトなど、さまざまな種類のオブジェクトを含むオブジェクト リストがあります。ここで、弾丸と敵のように、いくつかのオブジェクトが互いに衝突するかどうかを確認したいと思います。問題は、同じオブジェクトを使用して for ループ内に同じ for ループを配置すると、期待していた動作が得られないことです...これを処理するより良い方法を知っている人はいますか?

左の画像は弾丸が動かなくなったことを示し、右はループ内のループを削除したときの状況を示しています。

https://www.dropbox.com/s/92tnxizxdneqgz3/ss1.png

編集:さまざまな文字列がスクリプトから読み取られます。最大限の柔軟性を目指しています。これが、オブジェクトの種類ごとに異なるコレクションを必要としない理由でもあります。私がそれをしたとき、衝突は機能していました。

for (Object o : objects) {

    if (o.behavior.equals("aggressive")) {
        o.aggressive(ship.x, ship.y, ship.z);
    }

    if (o.behavior.equals("missile")) {
        o.missile();

        if (o.type.equals("bullet_player")) {
            for (Object n : objects) {
                             //doesn't matter what i put here
            }
        }
    }
}

解決:

問題は、配列リストの for ループを別の配列リストにネストすることにあるようです。私が最終的に行ったことは次のとおりです。配列リストを複製し、複製されたリストを元のオブジェクトリストでチェックし、オブジェクトが同じかどうかをチェックし、そうでない場合は衝突チェックを行います。

4

2 に答える 2

3

標準的なアプローチは次のとおりです。これは、各ペアを 1 回比較します。

for(int i=0; i<objects.size(); i++)
    for(int j=i+1; j<objects.size(); j++)
        //.... compare objects[i] and objects[j] for collision etc

ゲームの世界がより複雑になるにつれて、代わりにオブジェクトを空間インデックスに配置することを検討してください。

于 2012-07-30T21:59:17.300 に答える
0

ネストされたループは問題になりません。次の例では、同じコレクションでいくつかの反復子を実行していますが、期待どおりに動作します。

public static void main(String a[]) {
    List<String> strings = Arrays.asList("a", "b", "c");
    for (String s: strings) {
        for (String t:strings) {
            System.out.println(s + "/" + t);
        }
    }
}

問題は衝突検出内にあるように見えます。誤検知がある可能性があります (衝突が発生しなかった場所で衝突が検出されました)。

于 2012-07-30T22:02:13.887 に答える