描画用に Java2D ライブラリを使用して Java で 2D ゲームを作成しています。ゲーム オブジェクトの描画とそれらの衝突検出の両方に使用できる float 精度の Polygon オブジェクトが本当に必要です。残念ながら、Java の Polygon オブジェクトは int 精度しかなく、Rectangle や Rectangle2D のような同等の Polygon2D はありません。いくつかのオプションがあることを確認するのに十分な調査をすでに行っていますが、どれもあまり良いようには思えません。
Path2D を使用します。このフォーラムに投稿した Java 開発者によると、Polygon2D の欠如は見落としでしたが、代わりに推奨されるのは Path2D です。残念ながら、Path2D は、衝突検出を行うために必要な個々の頂点またはエッジにアクセスする方法を提供していません (具体的には、各エッジに直交するベクトルを取得する必要があります)。
Shape インターフェイスを実装する独自の Polygon2Dを実装して、引き続き に渡すことができるようにし
Graphics2D.draw(Shape)
ます。これはなかなか難しそうですね。contains(Rectangle2D)
Shape インターフェイスには、 や などの実装が難しいメソッドが必要getPathIterator(AffineTransform)
です。特にgetPathIterator
、これを実装するには PathIterator 型のオブジェクトを返す必要があるようですが、パブリック AWT パッケージで利用できる PathIterator インターフェースの具体的な実装はありません。個々の頂点を「記憶」してクライアントに提供するオブジェクトにPath2D をラップします。これは、コンポーネントの形状を記憶する Area が必要な場合に役立ちました。それを、Shape インターフェースを実装する CompoundShape クラスにラップし、すべての Shape メソッドを Area のそれらの実装に転送し、同時に、追加された各 Shape を追跡しました。 ArrayList 内の領域。これに関する問題は、 の 2 つの配列で個々の頂点を追跡する場合
float
、ユーザーが頂点を変更する可能性なしにそれらをユーザーに公開する方法がないことです。これは直接配列アクセスによって発生するため、内部 Path2D は変更の通知を受けません。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」とは呼ばれないパッケージに入れるようにしました。
これを進める最善の方法は何ですか?これらのオプションのいずれかを機能させる方法についての提案、またはこれらの問題が発生しない別のオプションのアイデアをいただければ幸いです。