マップ情報の管理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
友人

マップ情報の管理について

#1

投稿記事 by 友人 » 6年前

現在、横スクロールのアクションゲームを作成していますが、
マップ情報の管理について悩んでおります。ご教示頂けますでしょうか。

古い作品での例えになりますが、スーパーマリオブラザーズの1面では、
  ・ゲーム開始時の「地上ステージ」
  ・土管の中の「地下ステージ」
と、複数のステージで構成されています。

この場合、1面の開始時に
  1.地上・地下ステージの情報をすべて読み込み、保持している。
  2.地上ステージの情報だけを持っていて、土管に入った際に地下ステージの情報を読み込んでいる。(地上ステージの情報は破棄)
のどちらの設計が好ましいでしょうか?
(マップサイズやステージ数に左右される部分だとは思いますが……)

上記1では、ステージの切り替え時に読み込みは不要になりますが、保持する情報がステージの数だけ増加。
上記2では、ステージの切り替え時に読み込みが発生しますが、保持する情報量は少なくなります。
(両ステージで共通して使用する箇所は予め読み込みしています)

現在はステージ間の行き来をすることを考慮し、何度も読み込みが走るのを避けるため、
上記1での実装をしており、特に困ったことはないのですが、
困っていないからOK! とするのも、納得する理由としては心地の悪い状態です。

本格的にゲーム制作を始めたのが今回が初めてのため、本当にこんな設計でいいのか?
といったことろですが、上記1・2ではどちらの実装が好ましいでしょうか。
また、上記以外の管理方法がございましたらご教示頂けますでしょうか。

アバター
usao
記事: 1887
登録日時: 11年前

Re: マップ情報の管理について

#2

投稿記事 by usao » 6年前

> 上記以外の管理方法

最初は地上ステージだけ読込 → 初めて地下に行く際に地下ステージを読込(地上ステージの情報は破棄しない)

という形も考えられますね.

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: マップ情報の管理について

#3

投稿記事 by ISLe » 6年前

わたしのやり方は、そのどちらかではなくハイブリッドです。

外部ストレージへのアクセスがネックになる場合に、あらかじめ読み込んでおく、という場合でも、使っていないステージのデータは圧縮されていて、必要になった時点で展開する、といった方法を取る場合があります。
#例えば、ファミコンの容量の少ないROMカセットにステージデータが入っていて、本体RAMに展開して使うといった形態。

それとは別に、次に移動するであろうステージのデータをバックグラウンドで少しずつ読み込む、といった方法を取る場合があります。
#例えば、容量は大きいがアクセスの遅いCD-ROMからステージデータを読み込むといった形態。

ステージ間の行き来をすることを考慮する場合、前のステージをキャッシュしておくという方法もあります。

どこから読み込むかは常に選択できることが望ましいし、データの格納形式も常に選択できるのが望ましい、と考えます。


ここまでを前提とすると、質問の趣旨は、地上・地下ステージをまとめてひとつのマップとするのが良いか、分けるのが良いか、という話になり、その回答としては、どちらでも良い、という結論になります。

1. 地上と地下を分けないなら、ステージ1とステージ2は分けないのか。すべてのステージをひとつのマップとするのか。どこかで分けるのならその手法をすべてに応用でき、分けないことを100%徹底できる状況は極めて限定される。
2. 分けることには、分けないことも含まれる。地上と地下を分けることができるプログラムにおいて、地上と地下をひとつにまとめたマップを処理することに何の障害もない。
というのが根拠です。

マップを分けることは、マップを分けないことの上位にあたります。
もちろん現時点で必要ないのであれば、取り組まないのも間違いではありません。

マップを分けることができるプログラムだと、デザインの自由度が高く、開発効率も向上します。
余裕があるなら積極的に取り組んでみてください。

友人

Re: マップ情報の管理について

#4

投稿記事 by 友人 » 6年前

>usasoさん

>最初は地上ステージだけ読込 → 初めて地下に行く際に地下ステージを読込(地上ステージの情報は破棄しない)
マリオの例であれば、地下ステージから地上に戻ることが想定される場合などに使用できそうですね。
考えが凝り固まっており、取捨選択することを失念していたため大変参考になりました。


>ISLeさん

具体的なご回答ありがとうございます。
ひとつの面に複数ステージ……という考えであったため、この考えに及びませんでした。
必要な情報を必要なタイミングで必要な分だけメモリに展開することが目的となるため、この考えはとても勉強になります。

これらを実現すれば、各ステージ間の移動時にも(バックグラウンドの処理が完了していることを前提として)ストレージからの読み込みが発生せず、
かつ、再利用される可能性のあるデータはキャッシュ化、不要となったタイミングでキャッシュから削除とすることで、
メモリに保持する情報量を最小限に抑えつつ、読み込み時間も気にならない実装が可能となりそうです。

バックグラウンドでの読み込みについては、マルチスレッドあたりを使用する想定ですが、
これはまた別の質問となりますので、自身で調査・考察してから、
必要であれば再度ご質問をさせて頂きたいと思います。


改めて、ご回答をくださいましたusasoさん、ISLeさん
ありがとうございました。解決とさせて頂きます。

返信

“C言語何でも質問掲示板” へ戻る