2Dゲーム用のマップを作成する最良の方法は?


16

主観的な「最高の」キーワードをおaびします。

友人と私は2Dアドベンチャーゲームの作成を開始しました。ポケモンまたはゼルダのスタイルでトップダウンになります(視点のみ)。私たちは、プレイヤーがマシンのメモリ機能に負担をかけずに横断できる大きな世界地図を作成する方法を議論してきました。

最初の衝動は、大きなマップと、コンテンツがロードされるプレーヤーの周りの円を作成することでした。これは長くは続かないと考え、マップをセクションに分割することにしました。最初に、4つの大きなセクションがありましたが、単純に多くの小さなセクションに分割できることに気付きました。

私はSNESのゼルダをいくつかプレイしましたが、マップのシフト中に、その時点でコンテンツをロードできることがわかりました。つまり、ロードするデータの長方形領域を単にチェックするのではなく、マップ部分からマップ部分に移動するときにデータをロードおよびロード解除する多数の小さなチャンクにマップを単純に区分します。

今日、彼は、ゲーム内のすべてのグリッドに関するデータを含み、必要のないデータのディスクへの常時保存操作である単純な2D配列マップ[WIDTH] [HEIGHT]を作成したいと言った。

私はこれらのアイデアについて確信が持てず、ここでそれをするかもしれないと思った。このテーマに関するリンク、リソース、チュートリアルは大いに評価されるだろうし、それを効率的に行う方法に関する質問への直接的な回答も歓迎するだろう。


どのマシンを使用していますか?
デビッドチタレンコ

これまでにSFMLを使用したC ++を搭載したWindows(SFMLは変更される可能性がありますが、C ++は変更されません)。私たちは、移植性のATMを目指していません。
IAE

2
NESで旧式のZeldaを使用する場合は、1画面のみのマップを使用します。小さなマップは、プレイヤーが自分の意図の範囲に集中するのに役立ちます(つまり、ダンジョンでは、あなたは自分の部屋だけを扱っています。ディアブロでは、モンスターはフロア全体を上下しません)。 FAllout3やOblivionのようなオープンスペースゲームでは得られません。
スティーブンフルラニ

回答:


27

まず、マップサイズを見積もります。「大きな世界」がメモリに収まらないと思い込まないでください。現在、メモリ内で10 mb以上を使用するマップは完全に受け入れられ、単純なタイルベースの2Dワールドでは10 mbにLOTを詰めることができます。

本当に大きな世界がある場合、最も堅牢なソリューションは実際にマップチャンクを使用することです。ワールドを固定サイズのチャンク(64x64など)に分割します。プレイヤーが動き回るときにオンザフライでチャンクをロードし、少なくとも1つのチャンクをすべての方向にロードしたままにします(つまり、プレイヤーがいるチャンクとそのすべての隣人をロードします)。

チャンクのアンロードに関しては、いくつかの戦略から選択できます。熱心にアンロードすると、プレーヤーが十分遠くに移動した瞬間に、すべてのチャンクをアンロードしてディスクに保存します。ただし、パフォーマンスを向上させるためにアンロードを遅らせることもできます(ディスクアクセスと同様に、チャンクを保存するのはコストのかかる操作です)。


6
いくつかの実例となる数学:10MBのTile *は、1辺あたり1619タイルの正方形を取得します。元のゼルダのマップは、長辺が256タイル、短辺が半分以下でした。そのため、マップは、そのメモリ使用量を持つ最初のゼルダの36倍以上になる可能性があります。あなたは本当にそんなに多くのコンテンツを作る準備ができていますか?(いいえ)

@ user744そのコメントは信じられないほど紛らわしいです。マップを作成するには、タイルへのポインター以上のものが必要です。タイルに含まれるデータも保存する必要があります。すべての2Dゲームに一定量の事前定義された固定タイルがあるわけではありません。
Jeroen

5

個人的には、TileEdなどの指定されたタイルエディターを使用してマップを作成します。このアプローチにはいくつかの利点があります。

  • 少ないリソースを使用します。潜在的に無限のマップを構築するために、インデックス付きのタイルシートとデータファイルをロードするだけです。
  • マップは非常に小さなチャンク(タイルサイズに応じて)に分割されるため、キャラクターが世界を移動している間に行/列を簡単に追加/削除できます。
  • マップを記述するデータファイルがあると、地形情報を簡単に追加することもできます。これにより、壁や湖(障害物)などのさまざまなタイルタイプ、またはキャラクターの動きを遅くすることができる沼地が可能になります...
  • 最後に大事なことを言い忘れましたが、タイルベースのマップは、いつでもエディターを起動し、いくつかの変更を行い、新しいデータファイルを保存できるので、後で編集や調整がずっと簡単です。

ラグを防ぐために、ゲームプレイ中にマップのビットをロードしないようにすることをお勧めします。前述のように、おそらくタイルシートをメモリに保持できるため、これは必要ではありません。キャラクターが「世界」の別の部分に入ると、タイルシートを別のものと交換できます(たとえば、雪のタイルを砂漠のタイルに置き換えます)。

タイルをスクリーンにブリットすることは、おそらくマップをレンダリングする最も速い方法です。私はSFMLを知りませんが、彼らのサイトのドキュメントから、Spriteクラスを調べるか、クラスのCopy機能を使用する必要がありますImage

アップデート:私はちょうどSFMLドキュメントのいくつかを読んで、あなたは間違いなく使うべきDrawableか、Spriteパフォーマンスのために画像を操作するのではなく。明らかに、Tiled SFMLローダーがそこにあります。これはおそらく、何かを高速に実行するための良い方法です。


1

まず、ゲームに伝えたいストーリーを伝えるのに必要なサイズのマップを作成します。ユーザーがゲームをプレイするために最低限必要な仕様でマシンでテストします。遅すぎる場合は、プロファイルを作成して最適化します。



-3

アルティマオンライン(フォールアウト3またはOblivion)の再構築を計画しているのでない限り、世界をシームレスにする必要はありません。Baldur's GateとIcewind Daleは、ゲームプレイを損なうことのない効果的なマップを実装する2つのゲームです。

確かに、あなたは彼らがしているよりもはるかに多くのコンピューティング能力を持っているので、読み込み画面は最小限でなければなりませんが、フォールアウトとオブリビオンでさえいくつかのことのために読み込み画面を持っています。

私に言えることは、私のために、32x32タイルセットを取得してNSImageに描画する、iPhone用の小さなObj-Cライブラリを書いているということだけです。この方法で約10fpsを取得し、おそらくOpenGLを使用する必要がありますが、文字が四角形から外れた場合にのみ再描画する必要があります。

マップを9つの画面サイズ(私にとっては960x640ブロック)に分割する必要があります。したがって、キャラクターが中央のブロックから移動すると、9つの画面を大きな画像(約1.2MB- iPhone 3Gで20MBの制限の下にある部屋)。それはかなりゆっくり(10fpsよりはるかに遅い)行われるため、再生中に再描画は目立ちません。

いつかOpenGL ESに移行する可能性がありますが、今のところは正常に動作します。


[編集]

はっきりさせてください。

9画面の背景の描画アルゴリズムには0.1秒かかります(10fpsフラットアウト)。プレーヤーが10分の1秒以内に画面全体を移動できる場合を除き、プレイ中の再描画は感知できないはずです。


10fpsがゲームに受け入れられるという理由だけで、特にiPhoneのような電力の制約があるデバイスでは、それは良いアイデアになりません。再描画をゼロにして、GPU側でラスタライズを処理し、実際にプログラムがスリープ状態になるのを少し待って、電話が熱くなったり、バッテリーが切れたりしないようにすることができます。

@Joe Wreschnig ... ??? プレーヤーが画面を移動するとオンデマンドで描画します。そうしないと、UIImageViewの背景画像が再描画されないため、処理能力が節約されます。あなたのコメントは意味がありません。
スティーブンフルラニ

ゲームに必要なfpsについては主張していません。私は、OpenGLはそのようなことに対して60fpsを簡単に提供できると言っています(実際、静的シーンとOpenGLで「再描画」について話すことすらありません)-10fpsだけが必要な場合、OpenGLを使用すると、他の「50フレーム」。GPUアクセラレーションのある世界では、描画方法は無駄です。おそらくPCでは問題ありませんが、バッテリーを消耗しているときはそうではありません。

@ジョー、あなたが何を言っているのかまだわかりません。画像を描画します。次に、プレーヤーが境界に達するまで画像がそのまま残され、新しい画像が再描画されます。それはどのようにバッテリー寿命を無駄にしますか?オンデマンドでのみ「描画」され、残りの時間はUIImageViewのネイティブ描画アルゴリズムを使用してビューが描画されます。
スティーブンフルラニ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.