1

しばらく前に Java で書いたゲーム エンジンを修正しています。Sprite オブジェクトを保持するマスター Arraylist があります。Sprite クラスは、指定されたスプライトの X および Y 位置を float 型で保持します。

特定のスプライト (プレーヤー) までの相対距離に基づいてリストを並べ替えようとしています。2 つのスプライト間の距離を計算するメソッドがあります。

/**Retrieve a double value that represents the distance between 2 sprites*/
public static double getSpriteDistance(Sprite s1, Sprite s2) {
    return Math.hypot((s1.getX() - s2.getX()), (s1.getY() - s2.getY()));
}

位置に基づいて並べ替えるために使用されるスプライトと、すべてのスプライトのマスター リストを渡す別の方法があります (マップに応じて、リストに約 500 ~ 700 個のスプライトがあります)。

/**Sort a Sprite list relatively based on a specific sprite's location*/
public static ArrayList<Sprite> relativeSort(Sprite s1, ArrayList<Sprite> list) {             
    //Sort
    return list;
}

これは、私が一般的にそれを行う方法に関して行き詰まっている場所であり、効率と速度に関して将来を見据えています。2 つのスプライト間の距離を測定する方法があります。リストを並べ替えるだけで、並べ替える特定のスプライトがリストの最初の項目になり、最も遠いスプライトが最後になります。

再帰的な方法で並べ替えるか、while ループを使用することを考えましたが、もっと良い方法があるように感じます。Comparators と Collection の sort() メソッドの使用について読みました。しかし、私が見た例は非常に基本的なものです。

ご協力いただきありがとうございます。ご不明な点がございましたら、お気軽にお問い合わせください。

編集:誰かがこれを私にリンクしてくれる気がするので、私はそれについて知っていることを明確にしますが、これを使用して上記で指定したことを実装する方法を理解するのに苦労しています:

http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

4

1 に答える 1

3

Comparatorこの署名に従うを作成する必要があります。

public interface Comparator<Sprite> {
    public int compare(Sprite obj1, Sprite obj2);
}

をリストの最初にソートする場合、このメソッドcompareは正の数を返し、それ以外の場合は負の数を返す必要があります。obj1

次に、に渡すことができますCollections.sort()


実際には、そのようなオンザフライで非常に簡単にクラスを作成できます。

/**Sort a Sprite list relatively based on a specific sprite's location*/
public static ArrayList<Sprite> relativeSort(Sprite s0, ArrayList<Sprite> list) {             

    Comparator<Sprite> comp = new Comparator<Sprite>() {
        public int compare(Sprite s1, Sprite s2) {
            //return a positive number if s1 is closer to s0
            //return a negative number if s2 is closer to s0
        }
    };
    Collections.sort(list, comp);
    return list;
}
于 2012-07-22T03:03:11.967 に答える