マップの当たり判定について

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

マップの当たり判定について

#1

投稿記事 by yamataro » 15年前

今マリオのようなアクションを作っているのですが、マップの当たり判定がうまくいきません。
ブロックとキャラクターが重なったり、たまにすり抜けたりもします。
マップ判定の部分のコードを簡略化して書くと、

void map_judge(int x,int y,int* flag){

for(int i=0;i<4;i++)
flag = 0;

if(map[y / map_ysize + 1][x / map_xsize] == 1){flag[0] = 1;}//下向き
if(map[y / map_ysize - 1][x / map_xsize] == 1){flag[1] = 1;}//上向き
if(map[y / map_ysize][x / map_xsize + 1] == 1){flag[2] = 1;}//右向き
if(map[y / map_ysize][x / map_xsize - 1] == 1){flag[3] = 1;}//左向き

}

※map_xsize,map_ysizeはブロックのサイズです。


こんな感じなんですが、なんか根本的に間違っているような気がします。
間違いがあれば、指摘していただければ幸いです。
よろしくお願いします。

パコネコ

Re:マップの当たり判定について

#2

投稿記事 by パコネコ » 15年前

ジャンプしたりして、4つのブロックの間にキャラクターがいるときは大丈夫ですか?
(勘違いだったらごめんなさい)

==============
右下のブロックとか…
画像

めるぽん

Re:マップの当たり判定について

#3

投稿記事 by めるぽん » 15年前

パコネコさんの言うとおり、間にキャラクターがいるときの問題だと思います。
例えば map_xsize, map_ysize が 20 だったとして、map のデータが
0 0
0 1
となっているとします。このときにキャラの左上座標が (10,10) だったときを考えると、
キャラの幅を考えると見た目は明らかに当たっていると思います。
ただし、実際の map_judge の処理は、x/map_xsize と y/map_ysize が 0 なので map[0][0] の上下左右を見ることになり、
map[1][1] を確認しないため当たったことになりません(範囲外アクセスなのはこの際無視します)。

なのでキャラの(x,y)座標だけでなくキャラの幅も考慮する必要があるのですけど、
当たった方向を考えつつのやるのはめんどそうですねぇ・・・。

まあ例えば
キャラのwidth<=map_xsize && キャラのheight<=map_ysize
なのであれば、キャラの4点だけ見れば十分そうなので、
map_judge(x, y, &flag);
// 補正処理とか
map_judge(x + chara_width - 1, y, &flag);
// 補正処理とか
map_judge(x, y + chara_height - 1, &flag);
// 補正処理とか
map_judge(x + chara_width - 1, y + chara_height - 1, &flag);
// 補正処理とか
って強引に解決しちゃってもいいかもしれませんね。

パコネコ

Re:マップの当たり判定について

#4

投稿記事 by パコネコ » 15年前

結構前に先生に教えてもらった方法ですが、座標を4つに分けるというものでした。
x1=x/xsaizu;
x2=(x+xsaizu-1)/xsaizu;
y1=y/ysaizu;
y2=(y+ysaizu-1)/ysaizu;

みたいに?したら座標がぴったりのときは今までと同じですよね。
4つに分けるなら
x1は左で、x2は右にあるときです。
y1は上で、y2は下にあるとするという感じです。

私は、こういうものを使ってます。

yamataro

Re:マップの当たり判定について

#5

投稿記事 by yamataro » 15年前

返事が遅れてすいません。
ご回答ありがとうございます。

やっぱり難しいですねえw
座標を4つに分けるというのは、x1,x2,y1,y2を使ってそれぞれの方向に判定する、ということですか?

wing

Re:マップの当たり判定について

#6

投稿記事 by wing » 15年前

yamataroさん、こんばんは。
マップの当たり判定って人によっていろいろあるし、
それを分かるように解説するのはたいへんだと思います。

添付の画像は、私が作った「スーパーマリコ」の
最初のころのサンプルです。
もし要望があれば、ソースやデータをアップします。

パコネコ

Re:マップの当たり判定について

#7

投稿記事 by パコネコ » 15年前

あくまでも方法の一つという感じですかね。

右側にある壁(ブロック)を判定するならこんな感じで
if(map[x2][y1]==1 || map[x2][y2]==1){

}
map[/url][/url]==1のときはブロックありです。
その時は移動した分戻すとか…
座標をx=x1*xsaizuにするとかですね。

注意
これは右に移動するときの判定です。
ジャンプとかは、また別です。
書き方はおんなじでもできますが分けないとできません。

yamataro

Re:マップの当たり判定について

#8

投稿記事 by yamataro » 15年前

ご回答ありがとうございます。

すみません、パコネコさんの方法で試してみたのですが、どうしてもうまくいきませんでした。
あと、wingさん、ソースを見せてもらえれば幸いです。

パコネコ

Re:マップの当たり判定について

#9

投稿記事 by パコネコ » 15年前

ちなみに、「yamataro」さんの場合だと私とはXとYが逆ですよ。

一応書き方としては
x+=ax;//プレイヤーが横移動
//ここで判定です。
if(0<ax && map[x2][y1]==1 || map[x2][y2]==1)//右移動時
x=(x2-1)*xsaizu;//壁まで移動?
if(ax<0 && map[x1][y1]==1 || map[x1][y2]==1)//左移動時
x=(x1+1)*xsaizu;//壁まで移動?

ay++;//自由落下
y+=ay;//ジャンプなどの縦移動
if(0<ay && map[x1][y2]==1 || map[x2][y2]==1){//下移動時
x=(y2-1)*ysaizu;//地面まで移動?
ay=0;
}
if(ay<0 && map[x1][y1]==1 || map[x2][y1]==1){//上移動時
x=(y1+1)*ysaizu;//頭ぶつけます。まで移動?
ay=0;
}

これでだめなら、相性悪かったということですね。
移動の書き方によってもあたり判定の書き方、書く場所は変わると思いますし…
私も他の人の見てみたいですね。
「wing」さんのソース楽しみにしてます。

wing

Re:マップの当たり判定について

#10

投稿記事 by wing » 15年前

アップします。
http://www1.axfc.net/uploader/Sc/so/136724
キーは7777です。
説明のところに「テストマリコ」と書いてあります。
ファイルサイズは40KBくらいだったんですが、
拡張子がないとアップできなかったのでzipにしました。

新しいプロジェクトを作ってそのフォルダの中にコピー
すればいろいろいじることができると思います。

閉鎖

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