トップページ > 過去ログ > 記事閲覧
マップ描写について
名前:EL-ZELK 日時: 2007/06/12 03:30

はじめまして。 アクションゲームでマップを描写する際、 サンプルプログラム30を参考にして 0,0,0,0,0, 1,0,0,0,0,…… のような配列を使用して描写しているのですが、コレについて2つほど質問があります。 1.市販されているアクションゲームのような縦横にかなり広めのマップも、   ”1つの”配列にマップの全データをずらっと記述する。 2.マップチップに床A・床B・柱…など複数用いたい場合、   配列を0,0,2,1,3,……のようにし、   0の時は壁なし、1の時は床A、2のときは床B…   などとチップの種類の分だけ数字を用意し、数字に応じて対応チップを描写させる。 上記1・2に関して、プログラムの動作的、記述的に現実的と言えるでしょうか? (この記述による問題などはないでしょうか?) アドバイスを頂ければありがたいです。 どうぞ宜しくお願いします。

Page: 1 |

Re: マップ描写について ( No.1 )
名前:Prometheus 日時:2007/06/12 13:29

・ Ans 1  意味が「ソースコードに直接配列で記述していくこと」だとすると、 非現実的とまでは言いませんが、あまりしません。  規模の大きなゲームでは普通は専用の何かしらのツールを作って、 ファイルとしてデータを出力し、ゲーム本体側ではそのデータを読み込んで使用します。  ソース内に直接書き込むことはほぼありません。  なので使うとしたら配列ではなく、ポインタだと思います。 ・ Ans 2  基本的にはそうです。
Re: マップ描写について ( No.2 )
名前:管理人 日時:2007/06/13 10:37

EL-ZELKさん始めまして、DXライブラリの管理人です。 Promethuesさんが既にご返信されていますが私も一応・・・ 1.市販されているアクションゲームのような縦横にかなり広めのマップも、   ”1つの”配列にマップの全データをずらっと記述する。  画面の切り替え(マップ移動やステージクリアなど)が入らない範囲では 一つの配列だと思いますが、何らかの事情があれば複数の配列に 分ける(128x128マスで1ブロック(1配列)それが縦横8ブロックづつある、など) かもしれません。  とはいえ市販の2Dゲームの中身を見たことがないので実際はどうなって いるのかはわかりません。 2.マップチップに床A・床B・柱…など複数用いたい場合、   配列を0,0,2,1,3,……のようにし、   0の時は壁なし、1の時は床A、2のときは床B…   などとチップの種類の分だけ数字を用意し、数字に応じて対応チップを描写させる。  はい。 ただ、場合分けを switch や if で行うと種類が増えれば増えるほど 処理が重くなってしまうので、int型配列に各数値に対応した画像ハンドルを LoadDivGraph で読み込んでおいて、描画時は種類番号の配列要素を描画関数に 渡すだけで描画画像を変更出来るようにします。 〜〜〜〜読み込み処理〜〜〜〜〜 int ChipGraph[64]; // ChipImage.bmp は32x32サイズのチップの画像が縦横8個づつあるとします LoadDivGraph( "ChipImage.bmp", 64, 8, 8, 32, 32, ChipGraph ); 〜〜〜〜実際にマップを描画するとき〜〜〜〜 for( i = 0; i < マップの縦幅 ; i++ ) for( j = 0; j < マップの横幅 ; j++ ) DrawGraph( j * 32, i * 32, ChipGraph[ MapData[i][j] ], FALSE );  ちなみに説明の中で LoadDivGraph 関数で読み込んでいる画像は 32x32 サイズの チップを縦横8個づつ、つまり 256x256 の大きさの画像となっていますが、これは LoadDivGraph で読み込む画像が2のn乗(2,4,8,16,32,64,128,256,512,1024,2048) のサイズを持つ場合、LoadDivGraph で読み込んだ一つの画像に書かれたチップを 連続して描画するとチップが一つづつ別の画像になっている場合より高速に描画 出来るからです。
Re: マップ描写について ( No.3 )
名前:EL-ZELK 日時:2007/06/13 22:48

>Prometheusさん 成る程、一々ソース内書き込みではなくそれによって読ませるのですね。 確かにマップが多くなればなるほどソース内だと乱雑になってしまうので、その方がよさそうですね。 >管理人様 ブロック分けという手もありましたか!それなら広いマップも対応できそうです。 switchやifを使う以外にも考え方によってはスッキリ書けるのですね…勉強になります。 お二方とも早期返答、ありがとうございました! 作成の参考にさせていただきます。

Page: 1 |