広いマップの当たり判定

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

広いマップの当たり判定

#1

投稿記事 by きずなん » 8年前

現在2DRPG作成中です。

質問ですが、広大なマップの当たり判定に悩んでいます。
現在の手法はこのサイトで紹介されてるように
int hantei[マップ縦サイズ][マップ横サイズ]={
{1,1,1,・・・}
{1,0,0,・・・}
};
という感じで、表示されるマップのチップ1つに1つに番号を振って、判定関数に、「進んだ先が1なら1を返す」という感じにし、その判定関数の返り値で進めるかどうか判定してます。
まだ縦横32pxのチップを100個×100個ぐらいならこのやり方でもできないこともないのですが、
RPGの広大なフィールド、ワールドマップになると(1000個×1000個の予定です)さすがに厳しいように感じます。

softyaさんのページも参考にしたのですが、ちょっと難しすぎて理解できませんでした。(すいません)
何かいい方法は無いのでしょうか。
マップエディタに使ってるのはPlatinumです。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: 広いマップの当たり判定

#2

投稿記事 by beatle » 8年前

特にチップ数が増えても,同じやり方でいい気がしますけれど.
毎回毎回1000×1000をfor文で探索する訳ではなく,主人公の進行方向だけを調べればいいのでは.

きずなん

Re: 広いマップの当たり判定

#3

投稿記事 by きずなん » 8年前

主人公の進行方向(というか一歩先?)だけ調べるようにはしてます。

例えば左キーが押されたときに、
関数(){ 
  if ( go[x-32][y] == ○ ){
   return 1;
  }
};
と定義して、進んだ先が○なら1を返す、でこの関数で進めるかどうか判定してるのですが、
これだと「進めるか進めないかの配列」、(ここでいう○にあたる)は1000×1000個記述する必要がありますよね。
この作業をどうにかうまいことを省けないかなと思っています。

non
記事: 1097
登録日時: 9年前

Re: 広いマップの当たり判定

#4

投稿記事 by non » 8年前

きずなん さんが書きました:「進めるか進めないかの配列」、(ここでいう○にあたる)は1000×1000個記述する必要がありますよね。
ここ、意味がわかりません。もっと詳しく説明してください。
non

きずなん

Re: 広いマップの当たり判定

#5

投稿記事 by きずなん » 8年前

自分で説明するよりここを見てもらったほうが伝わりそうですね。
http://dixq.net/g/25.html
ここのint hantei[20] に当たるものです。
これが横20だけのマップならint hantei[20]ですみますが、
1000×1000のマップだとint hantei[1000][1000]になりますよね。

アバター
SUE
記事: 41
登録日時: 8年前

Re: 広いマップの当たり判定

#6

投稿記事 by SUE » 8年前

おっしゃる通り、マップ配列のサイズは[1000][1000]になります。確かに環境によってはがっつりメモリを使うので容量的に厳しいかもしれません。また、1000x1000個ものマップをエディットするのも相当大変だと思います。

ですが当たり判定そのものは重くなりません。コードをよく見ると、サイズが[1]、[20]だろうと[1000]だろうと「進行方向の区間1つ」しか調べていません。つまり処理は変わらないので、いくらでも広大なマップを作って問題ないということになります。

と、いうことでよろしいでしょうか?
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】

Ryo

Re: 広いマップの当たり判定

#7

投稿記事 by Ryo » 8年前

RPGの広大なフィールド、ワールドマップになると(1000個×1000個の予定です)さすがに厳しいように感じます。
この「厳しい」というのはどういう意味でいってますか?

・データが多くなると、判定(るーぷやら何やらで)に時間がかかってしまうのではないか?
という疑問なら、他の方が書かれている通りです。

・広大なマップでも、意味を持たせている地点は多くないので、メモリが無駄になるのでは?
という疑問なら、今時のPCの性能なら、まず問題になるようなサイズになるとは思えません
それでも気になるなら
マップデータとは別に、座標・イベント番号 だけを持たせたイベント構造体でデータをつくり
一歩進むたびにこっちも検索するという手法もあります
(たとえば、hanteiに2をいれておいて、2のときだけチェックするとか)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 広いマップの当たり判定

#8

投稿記事 by softya(ソフト屋) » 8年前

単に作るのが大変という意味なら、その通りです。
Platinumはレイヤー機能があるので、レイヤーを理解してマップチップレイヤーと当たり判定レイヤーの作り方・使い方を理解したほうが後々救われると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きずなん

Re: 広いマップの当たり判定

#9

投稿記事 by きずなん » 8年前

なるほどなるほど・・・
労力も大変だしメモリも食うしやっぱりレイヤーを勉強しようと思います。

Platinumの使い方について質問ですが、
例えば1層(マップチップ画像配置)、2層(判定用のナンバー)、のようにつけて
その1層の情報、2層の判定用ナンバーを読みこむようなことはできるんでしょうか?
それさえ出来ればいいんですが。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 広いマップの当たり判定

#10

投稿記事 by softya(ソフト屋) » 8年前

まぁ、どのレイヤーも番号なんですよね。つまり、Platinum上はどっちもマップチップの番号なんです。
マップチップレイヤーはマップチップの番号として扱って、当たり判定レイヤーは番号を当たり判定のフラグとして使うということです。
どう扱うかはプログラマー次第となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きずなん

Re: 広いマップの当たり判定

#11

投稿記事 by きずなん » 8年前

うーん・・・難しそうですが本気で学んでみようと思います。
ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 広いマップの当たり判定

#12

投稿記事 by softya(ソフト屋) » 8年前

勉強のために自分でマップツールをDXライブラリで作るという手もあります。
自由に設計が出来るので自分専用の効率的なファイルが作れます。

あと少なくとも
・バイナリファイル
・ビット操作
・動的メモリ確保
・マウス操作
などなどの勉強にはなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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