タイルマップとユニット間の依存関係を管理する方法


11

作品には2Dタイルベースの戦略があります。マップとマップ上のユニットとの関係をどのように処理するか迷っています。

タイルの座標を考えると、もしあれば、その上にユニットを立てられるようにする必要があります。同時に、ユニットが指定されている場合、そのユニットの座標を取得できるようにしたいと思います。

これに対する2つの解決策を見てきました。最初の解決策は、ユニットに座標を格納させ、マップにユニット参照をタイルに格納させることです。これにより、マップとユニットの間に循環依存関係が作成されます。ユニットが移動した場合、マップと任意のユニットが同期していることを確認する必要があります。

2番目の解決策は、ユニットに座標のみを追跡させることです。タイルにユニットが含まれているかどうかを確認し、そのユニットを取得するには、ユニットユニットのセット全体をループして、座標が一致するユニットを見つけます。これは循環依存関係を解消しますが、最初のソリューションがマップからユニットを検索するために持っていたO(1)プロパティを失います。これは、経路の検索、移動範囲の決定、特定のユニットの有効なターゲットの検索などの目的で定期的にマップをスキャンできるようにしたい場合に加算されます。

また、ユニットをマップに格納することもできません(または格納できますか?)。ユニットは、プレーヤーまたはAIの「軍隊」に関連付けられています。軍は、そのすべてのユニットに簡単にアクセスして反復できる必要があります。

これは戦略ゲームでは一般的な問題のようですが、ユニット/マップの関係を管理するために説明した2つのパターン以外に他のパターンはありますか?

回答:


3

これは一般的なパターンではありませんが、リレーショナルデータベースの世界では3つ目の方法として、複数のキーを持つデータ構造を使用します。表形式では、次のようになります。

Unit id    Location
-------------------
  1309     13,15
  2357      7,93
  8552      7,93

「ユニット2357はどこにありますか?」7,93を取り戻します。また、「ロケーション7,93には何が入っていますか?」と尋ねることもできます。2357と8552を取得します。複数のキーで検索できるデータ構造があります。依存関係を削除する場合は、これをユニットの外とマップの外に保存できます。

ただし、実際には、各ユニットに場所を格納する方が一般的です。次に、特定の地域にどのユニットがあるかを示す空間分割データ構造を使用します。独立した構造であるため、領域はグリッドスペースである必要はありません。それらはより大きな領域になる可能性があります。

最も簡単な方法(2番目のソリューション)を実行することをお勧めします。その後、パフォーマンスの問題であれば、空間パーティションを追加して検索を高速化できます。


したがって、あなたが言及する空間分割データ構造は、単にマップ(私の場合、表面上はタイルの2Dグリッド)である可能性があります。ユニットが移動した(または追加された、または削除された)場合でも、ユニットと空間分割構造の両方を更新して同期を保つ必要があると思います。多分それは私が一緒に暮らさなければならないものの一つですか?
AJM、2011年

1
はい、マップは、使用する最も細かい空間パーティションです。すべてのユニットのグローバルリストは、最も粗いパーティションです。;)使用する前にパーティションを更新するだけです。常に使用している場合は、ユニットを移動するたびに更新する必要があります。ただし、更新ロジックの一部のフェーズでのみ使用している場合は、1回のパスでユニットリストを調べてパーティションデータ構造を計算し、完了したらそれを破棄できます。そうすれば、常に同期している必要はありません。
amitp

5

まあ、あなたはプレイヤーあたり数千ユニットでない限り、私はメモリ使用量を気にしないで、最初の解決策を使います。メモリはCPUよりも安いようです。

実際、プレーヤーごとに4000ユニットあり、2つの整数を使用して場所を格納し、8つのプレーヤーを使用した場合でも、2MBしかかかりませんが、最初のソリューションでは、O(1)coordゲッターを使用するのではなく、 O(n)(並べ替えられていないと想定)、多くのユニットでは遅くなる可能性があります。

ほとんどのゲームはタイルではなくピクセルベースであるように見え、現在ではユニットにコードを保存するだけで十分です。


私はメモリ使用量について心配していません。依存関係の管理に興味があります(オブジェクト指向設計の意味で)。私が心配するのは、最初の解決策が必要とする余分なメモリではなく、私がO(1)のcoordゲッターが好きなのと同じくらい、私が心配している循環依存関係です。また、今では多くのゲームがピクセルベースであることがわかっていますが、私はタイルが好きなので、それを使用しています。:P
AJM

@AJM、同じ、私がAndroidでリリースする有料アプリはタイルを使用します。
レイ・ブリトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.