0

ポケモンやゼルダのような 2D のトップダウン 45 度ゲームがあります。オブジェクトの y 値によって深さが決まるため、オブジェクトは y 値の順に描画する必要があります。たとえば、木の後ろに立っていると、プレイヤーの上に木が描かれ、木の後ろに立っているように見えます。

私の現在の設計では、タイルの列を描き、その列に立っているプレイヤーを描き、次の列を描き、その上に立っているプレイヤーを描きます。このようにして、プレーヤーよりも高い y 値を持つタイルは、深度をシミュレートするためにそれらの前に描画されます。

ただし、現在、私のプレーヤーは、std::vectorすべてのタイルが描画された後に単純に反復および描画されるオブジェクトです。私の方法が機能するには、タイルのすべての行のベクトルを反復処理し、それらが現在の行にある場合にのみレンダリングするか、フレームごとに何らかの方法ですべてのプレーヤーを y 値で並べ替える必要があります。これらの方法はどちらもかなり CPU を集中的に使用しているように見えますが、おそらく私はそれを考えすぎており、このタイプのゲームで奥行きをシミュレートする簡単な方法があります。

編集: このゲームは MMORPG タイプのゲームであるため、多くのプレイヤー/NPC が歩き回る可能性があるため、非常に効率的な方法が必要です。

アイデアやコメントをいただければ幸いです。

ありがとう

4

4 に答える 4

1

std::setまたはstd::mapの代わりにvector、オブジェクトをソートされた順序で保持することができます。残念ながら、それらの位置を単純に変更することはできませんy。座標を変更する必要があるたびに、削除/挿入する必要があります。

于 2012-06-12T19:18:43.027 に答える
0

(私の最初の提案を無視してください。それを読んだ場合、それはばかげていました。)

私の知る限り、基本的には、フレームをレンダリングするたびに、並べ替えられたコンテナーを反復処理する必要があります。これには計算上のペナルティがあり、毎回コピーと並べ替えを行う必要があることはそれほど悪くはありません (O(N log N) の並べ替え時間だと思います)。

ここでは、巧妙なデータ構造が役立つかもしれません。たとえば、各要素としてゲーム オブジェクトのベクトルを含む配列。配列の各要素は、タイル化されたグリッドの行を表し、オブジェクトのベクトルを反復処理し、それらを深度バッファー配列にビンに入れます (これには約 O(N) 時間かかります)。次に、各行を表すベクトルを反復処理し、各オブジェクトを順番に描画します。これも O(N) です。

もっと巧妙な z バッファリング手法があるかもしれませんが、それらは読者の演習として残しておきます。

于 2012-06-12T18:56:32.760 に答える
0

他の基準に従ってプレーヤーを並べ替えようとしていない限り、プレーヤーを繰り返し処理するたびに、プレーヤーを y 座標で並べ替えるだけで済みます。入力の大部分がソートされているときに線形時間で実行されるソートを使用する限り、このステップで O(n log n) 時間もかからないでしょう。ここでは、プレーヤーのセットがゆっくりと変化し、y 座標もゆっくりと変化すると仮定しています。この場合、ベクトルをソートする必要があるたびに、ほとんどソートされており、Smooth ソートや Tim ソートなどは線形時間で実行されます。

C++ の場合、Tim sort hereの実装を見つけることができるようです。

于 2012-06-12T20:58:18.420 に答える
0

スペースがある場合は、配列のインデックスが行番号であり、その行のプレーヤーのコレクションを含む配列を使用して、プレーヤーのリストの配列を作成する別のオプションがあります。

前述したように、これには少し余分なメモリが必要で、プレーヤーが別の行に移動するたびにブックキーピングが必要になりますが、描画は単純に行を反復処理し、その行に存在するプレーヤーを描画するだけです。

于 2012-06-12T21:26:50.303 に答える