2Dトップダウンビューマップ


8

これがどのように機能するのか疑問に思いました。

あなたはロードするか、完全なゲームの起動時にマップを、または実行時にマップの部分をロードするのですか?

そして、どのように地図を保存しますか?XMLか、それともバイナリ形式ですか?

ありがとう!

回答:


23

eビジネスに同意します。サイズと編集方法によって異なります。

合理的にコンパクトな表現でマップのバイトサイズを見積もります。また、ゲームのプレイ中にマップのどの部分を変更できるかを決定します。変更されないパーツをロードして、保存する必要はありません。推定サイズが小さい場合は、すべてをメモリに格納します。データが必要以上に大きい場合を除いて、マップの一部をロードし、ロードしたものかどうかを追跡するという複雑さはそれほど価値がありません。

たとえば、Civilization IIを作成している場合、マップサイズは100x100タイルになる可能性があります。

  1. 各タイルは12タイプの1つなので、4ビットで格納できます。つまり、メインマップは100 x 100 x 0.5バイト=タイルタイプを格納するための5,000バイトです。メインマップは変更されません。
  2. 道路や灌漑などでマップタイルを改善することもでき、最大7つの改善があります。つまり、7ビットを使用する2 ^ 7の異なる値を意味しますが、おそらく1バイトを使用するだけです。これにより、改善を保存するための100 x 100 x 1バイト= 10,000バイトが得られます。
  3. 戦争の霧はあなたが見たどのマップタイルを教えてくれるので、プレイヤーごとに1ビットが必要です。プレイヤーを8人に制限すると、マップタイルごとに1バイト、または戦争の霧の場合は10,000バイトになります。
  4. 最後に、すべての都市とユニットがあります。各プレーヤーには最大20の都市と100のユニットがあると推定することができ、これらのそれぞれに100バイトのデータ(大まかな推測)が必要になる可能性があるため、12,000バイトになります(XMLを使用している場合はさらに多くなります)。

Civ IIマップ+オブジェクトのコンパクトなバイナリ表現では30k未満なので、非常に大きい冗長形式を使用する場合でも、すべてをメモリに格納できます。上記の数値は、Civ IIマップ構造をリバースエンジニアリングした人から入手したものです。

Daggerfallは途方もなく大きいマップを持っていると一部では考えられていますが、5000x2500で約25メガバイトのようですが、NPCも多数あります(750,000は私が読んだものですが、非常に高いようです)。今日のデスクトップ/ラップトップマシンではこれもメモリに収まる可能性がありますが、モバイルデバイスやブラウザでは少し大きすぎる可能性があります。ダガーフォールマップ形式を説明するwikiがあります

冗長性を識別して除外することにより、サイズを削減できます。たとえば、100,000の同一のツリーまたは剣をそれぞれXML形式で保存する代わりに、1つのツリーと1つの剣、およびそれらへの100,000の参照を保存します。バイナリ形式では、その参照は1バイトまたは2バイトにすぎない場合があり、より詳細な形式では、参照は依然としてかなり小さい場合があります。

ゲームで機能する最も単純なことを行います。マップが小さい場合は、コンパクト形式と詳細形式のどちらを使用してもかまいません。コンパクトフォーマットがメモリに収まるが詳細なフォーマットは収まらない場合、バイナリフォーマットの追加作業がマップの一部のロードの追加作業より多いか少ないかを決定する必要があります。それはゲームに依存します。ターンをシミュレートするためにすべてのデータが必要なCivのようなゲームでは、バイナリ形式がおそらくより良い選択です。プレイヤーの近くにあるものを除いて領域をロードする必要がないダガーフォールのようなゲームでは、マップの一部をロードする方が適切です。地図がそうなら コンパクトフォーマットでもメモリに収まらない場合は、まず、それを処理するための追加の作業が本当に価値があるかどうかを自問し、そうである場合は、部分的にロードできるバイナリフォーマットを設計してください。

私の現在の(趣味)プロジェクトでは、マップとその上のすべてのオブジェクトは50 MBに収まるので、すべてをメモリに保持することで問題ありません。ただし、ブラウザーで実行したいのですが、50 MBはネットワーク経由で転送するよりも大きいので、サーバー上のすべてのメモリにそれらを保持し、クライアントの世界の一部のみをロードします。私のマップタイルは、タイルごとに1バイト、2048x2048タイル(4 MB)です。オブジェクト(木、椅子、オークなど)は、簡単にするためにJSONエンコードされています。クライアントでは、プレーヤーの近くにあるマップ領域(オブジェクトを含む)のみをロードします。


1
すばらしい回答をありがとう、これは私にすべてをクリアしました!(プロジェクトの幸運を祈ります:)
ケビン

4

ロードする量は、少なくともマップの大きさに依存します。データがメモリに適切に収まる場合は、プログレッシブロードを行う必要はありません。

XMLが行う最も注目すべきことは、追加のストレージ/メモリ/ネットワークスペース/トラフィックを大量に消費することです。XMLの使用が楽しいと思う場合は、比較的少量のデータに対してのみ行ってください。

データ形式を設計するときは、このデータをどのように編集するかを念頭に置く必要があります。単純なテキストエディターを使用してデータをプレーンテキストファイルとして書き込むことも、これらのファイルを直接使用することも、バイナリ形式に変換してスペースを節約することもできます。画像エディタを使用してレベルをビットマップとして作成することもできますが、ここでも小さなファイルに変換することをお勧めします。

または、独自のエディターを作成することもできます。その場合、コンパクトなバイナリ形式を使用しない理由はほとんどありません。


1

これらの質問に対する答えはありません。これらはすべて本質的にあなた次第です。

好きなようにマップを保存して、いつでも表示/レンダリングできます。


もう1つ追加します。パフォーマンス上の理由から、時間の経過に伴ってマップの一部をロードする必要があるかもしれませんが、ほとんどの実用的なゲームでは、モバイルデバイスで開発しない限り、問題はないと思います。
ブライアンハリントン

2
これは本当かもしれませんが、これが行われるいくつかの一般的な方法を提供することは素晴らしいことかもしれません。
共産主義者のダック

私は理解していますが、以前は「これをどのように行うのですか」という立場でした。私が受講したグラフィックスコースで難しい方法を学びました。ナビゲーションメッシュでA *を実装する必要がありました。私は何時間もかけて調査し、読み、それを行う方法を模索しました。結局、それは決して成し遂げられなかった。私は何を学びましたか?脳を複雑化させる前に、私が理解する方法でそれをやればよかったのです。
ブライアンハリントン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.