2

説明:

EDIT3:これは明確に説明されていないため、MASSIVE CLEAN UP。

タイルとエンティティから 2D レベルを構築しようとしています。エンティティは、たとえば伐採できる木です。各エンティティのデータ (残りのチョップ数など) を保存する必要があります。より動的な位置 (ダブル) と、より動的なスプライトの幅と高さを持たせたいと考えています。私のタイルは 32x32 ピクセルですが、ツリーは 1 つのタイルではなく、幅より高さが大きいスプライトになります。

レベルの最上部に近いオブジェクトを、他のオブジェクトより前に描画したいと考えています。この場合、ツリーの背後にあるキャラクターは、ツリーの中または前にレンダリングできません。このケースは、同じ種類の他のオブジェクト (ツリーなど) にも適用されます。エンティティをループして各エンティティの位置を計算するのは効率が悪いと思います。これは、レベルに多数のエンティティが存在する可能性があるためです。

いくつかの調査を行ったところ、特定のライブラリでは、オブジェクトとその位置の両方を MAP (Google の Guava では BiMap) に保存できることがわかりました。

質問:

  • これは非効率的な方法ですか..しかし
    、レンダリングをより効率的にするために適用できるいくつかの変更はありますか?
  • または、これはエンティティをレンダリングする非効率的な方法であり、より良い方法がありますか (そうであれば、Java には他にどのような方法がありますか)?
  • または、私がリストしていない他の何かがありますか?

EDIT2:以下の編集で投稿したリンクを調べました。Google の Guava (すべて正しいと思います) には BiMaps があるようです。通常のJavaでこれに相当するものはありますか? それ以外の場合は、Google のライブラリでおそらくこれを修正できます。しかし、私は、この 1 つのインターフェースのためにそのような巨大なライブラリーをインストールしたくありません。

やっと:

ここStackOverflowまたはインターネット上のどこかで、答えが私の目の前にある可能性が非常に高いです。私は最善の検索を試みましたが、何も見つかりませんでした。検索クエリの提案や、私に役立つ関連リンクがあれば、コメントに投稿していただければ幸いです。

これを読んでくれて/助けてくれてありがとう;)

編集:

私は見てきた; Java でのゲーム エンティティの位置の効率的なマッピング。この質問と密接に関連していると思います。しかし、それは私が探しているものではないと思います。これで解決できるかもしれないので、2番目の回答を詳しく調べます..しかし、よくわかりません。

解決

解決策は、配列、配列リスト、または別の方法でエンティティを追跡することです。ティック/更新ごとに、すべてのオブジェクトの Y 座標を取得し、エンティティが格納されている場所と同じサイズの別の配列/配列リスト/マップ/その他に格納します。エンティティに相当するすべての位置で、Y を格納します次に、別のループまたはhttp://www.leepoint.net/notes-java/data/arrays/70sorting.htmlを使用して注文します。

次に、レンダリング時に:

for(int i = 0; i < entityArray.length; i++)
entityArray[i].render();

もちろん、画面上または画面の近くにあるものだけをレンダリングすることで、より効率的にレンダリングできます。しかし、それは基本的に2Dのトップビュー/フロントビューでこれを行う方法です.

4

1 に答える 1

1

私自身の2Dゲームの試みで、次の解決策を思いつきました:

  • 列挙型を使用して、ゲーム内のさまざまな種類のオブジェクトを指定し、それらに優先順位を付けます (サンプルの順序: 草、川、木、生き物、キャラクター、雲、鳥、GUI)
  • すべてのビジュアル オブジェクトに、この DrawPriority 列挙型を取得できるインターフェイスを実装させる
  • 列挙型に基づく比較器でリストのソートされた実装を使用する
  • リストを使用してすべての要素を描画する

こうすれば、ビジュアル オブジェクトの挿入 (私の場合はレベルのロード中に行われます) でのみ行われるため、注文の計算はそれほど高価ではありません。

..そして、すでにコンパレーターを使用しているので、enum の優先順位の値が同じ場合は ax/y 比較を行います。これにより、y オーダー描画の問題が解決されるはずです。

于 2013-01-21T08:58:28.060 に答える