10

描画用に Java2D ライブラリを使用して Java で 2D ゲームを作成しています。ゲーム オブジェクトの描画とそれらの衝突検出の両方に使用できる float 精度の Polygon オブジェクトが本当に必要です。残念ながら、Java の Polygon オブジェクトは int 精度しかなく、Rectangle や Rectangle2D のような同等の Polygon2D はありません。いくつかのオプションがあることを確認するのに十分な調査をすでに行っていますが、どれもあまり良いようには思えません。

  1. Path2D を使用しますこのフォーラムに投稿した Java 開発者によると、Polygon2D の欠如は見落としでしたが、代わりに推奨されるのは Path2D です。残念ながら、Path2D は、衝突検出を行うために必要な個々の頂点またはエッジにアクセスする方法を提供していません (具体的には、各エッジに直交するベクトルを取得する必要があります)。

  2. Shape インターフェイスを実装する独自の Polygon2Dを実装して、引き続き に渡すことができるようにしGraphics2D.draw(Shape)ます。これはなかなか難しそうですね。contains(Rectangle2D)Shape インターフェイスには、 や などの実装が難しいメソッドが必要getPathIterator(AffineTransform)です。特にgetPathIterator、これを実装するには PathIterator 型のオブジェクトを返す必要があるようですが、パブリック AWT パッケージで利用できる PathIterator インターフェースの具体的な実装はありません。

  3. 個々の頂点を「記憶」してクライアントに提供するオブジェクトにPath2D をラップします。これは、コンポーネントの形状を記憶する Area が必要な場合に役立ちました。それを、Shape インターフェースを実装する CompoundShape クラスにラップし、すべての Shape メソッドを Area のそれらの実装に転送し、同時に、追加された各 Shape を追跡しました。 ArrayList 内の領域。これに関する問題は、 の 2 つの配列で個々の頂点を追跡する場合float、ユーザーが頂点を変更する可能性なしにそれらをユーザーに公開する方法がないことです。これは直接配列アクセスによって発生するため、内部 Path2D は変更の通知を受けません。

  4. Polygon.java をコピーします。Java の Polygon クラスの実際のソース コードは、grepcode.com で入手できます。頂点関連intの を に置き換えるだけで、Polygon2Dfloatを取得できます。残念ながら、これを試してみると、import sun.awt.geom.Crossings;「必要なライブラリ C:\Program Files\Java\jre7\lib\rt.jar の制限により、タイプ Crossings にアクセスできません」というコンパイラ エラーが発生しました。この質問によると、Sun の使用許諾契約ではコア Java クラスを独自のものに置き換えることはできませんが、Polygon はそうしようとはしません - タイプ sun.awt.geom.Crossings のオブジェクトを作成するだけで、置き換えや拡張は行われません。 Polygon のコピーを「Java」とは呼ばれないパッケージに入れるようにしました。

これを進める最善の方法は何ですか?これらのオプションのいずれかを機能させる方法についての提案、またはこれらの問題が発生しない別のオプションのアイデアをいただければ幸いです。

4

3 に答える 3

7

Path2Dもお勧めします。GeneralPathはレガシークラスです。使用しないでください。

Path2Dは、回りくどい方法ではありますが、頂点値へのアクセスを提供します。PathIteratorを使用する必要があります:

PathIterator pi = path.getPathIterator(null);
float[] value = new float[6];
float x = 0, y = 0;

while (!pi.isDone()) {
    int type = pi.currentSegment(values);
    if (type == PathIterator.SEG_LINETO) {
        x = values[0];
        y = values[1];
    }
    else if (type == PathIterator.SEG_CLOSE) {
        x = 0;
        y = 0;
    }
    else {
        // SEG_MOVETO, SEG_QUADTO, SEG_CUBICTO
    }
    pi.next();
}

ファンシーになる準備ができたら、それを拡張して2次曲線と3次曲線をサポートできます。ポリゴンについて話しているので、現時点ではそれらは必要ないと思います。

また、Path2Dには、パスが長方形と交差するかどうか、およびパスに長方形または点が含まれるかどうかをテストするための便利な静的メソッドがいくつかあります。残念ながら、別のパスと交差する、または別のパスを含むパスをテストする方法はありません。

于 2012-08-21T21:21:55.467 に答える
1

おそらく、ポリゴンの内部の縮尺が異なるのでしょうか?

書き込み時に大きな数値を掛けて int に型キャストし、読み取り時に同じ大きな数値で割りますか?

于 2013-01-12T06:42:21.860 に答える
0

サードパーティのライブラリを使用できますか? もしそうなら、 Slick 2D Polygonクラスを使用することをお勧めします。私が内部的に行うことは、実際の Polygon にこのクラスを使用して、containsとの交差をチェックし、描画する必要がある場合は、float値をキャストしintて Java2D Polygon を描画することです。

これが最適な解決策ではないことはわかっていますが、あなたがしていることにはうまくいくかもしれません。

于 2012-08-21T21:29:17.923 に答える