HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0609
Popint物体と物体の当たり判定5解決


Popint

リンク

2008/6/9(Mon) 16:22:56|NO.16603

はじめまして。
シューティングゲームを作っていて、
分らないことが出てきてしまったので質問させていただきます。

自機と敵弾の当たり判定についてです。
sqrt関数で距離を求めて当たり判定をしようと考えていたのですが、
当たり判定を3px程度にすると、敵弾が速い時に判定範囲を丸ごとすっ飛ばして
自機の上を通り抜けてしまうことがありました。

また、敵弾と自機の角度を前フレームと比べて180度変化している、という考えで
判定もしてみたのですが、これだと当たり判定がまちまちになってしまいました。

弾幕系なので当たり判定は極力3px以内に収めたいです。
また、敵弾の速さもスリルを求めるため、遅くすることは出来ません。

正しく判定を行うためにはどうすればいいでしょうか。
ご教授頂けると幸いです。



この記事に返信する


たこ

リンク

2008/6/9(Mon) 17:25:07|NO.16607

リージョンを使えばできそうです。やったことはないですが…

Create---Rgn系命令で自機の領域と敵弾の移動した領域を作る
CombineRgnで二つの領域の重なる部分を探して
あるかないかで当たったかどうかを判定する
ちなみにgdi32のAPIです



staRRats

リンク

2008/6/9(Mon) 17:45:15|NO.16609

リージョンとかの前に、自機を単純な三角形、四角形の形に置き換えて判定してくださいな。
じゃなきゃ当たり判定の勉強にもならんわ。



Popint

リンク

2008/6/9(Mon) 18:29:44|NO.16613

たこさん、staRRatsさん、返信ありがとうございます。

リージョンですか…
今まで触れたこともない領域ですので、暫く色々調べてみようかと思います。

自機を三角形や四角形に置き換える、というのはどういうことでしょうか?
敵弾は丸いものですので当たり判定は丸の形で判定したいのですが…
2物体の距離から当たり判定をしていたのですが、それではいけなかったでしょうか。
四角い物体同士の判定というとこのようなものでしょうか?

#const xsize 50 #const ysize 100 #const bxsize 100 #const bysize 100 randomize bx=rnd(640-bxsize) : by=rnd(480-bysize) *main redraw 0 color 255,255,255 : boxf color 0,0,128 : boxf bx,by,bx+bxsize-1,by+bysize-1 x=mousex : y=mousey color 255,0,0 : boxf x,y,x+xsize-1,y+ysize-1 if (bx<=x+xsize)&(by<=y+ysize)&(bx+bxsize>x)&(by+bysize>y) : title "当たってます" : else{ title "当たってません"} redraw 1 : wait 1 goto *main

暫く調べ物をするので、明日あたりに結果の報告をさせて頂きたいと思います。



あり

リンク

2008/6/9(Mon) 19:09:37|NO.16614

>Popintさん
線分交差で検索してみてください
すり抜け防止のヒントになると思います。

それ以外でのシンプルな解決法の一つには
内部処理を倍にして表示だけ1フレームおきにする
(表示が60FPSだとしたら内部は120FPSにする等)
というやり方もありますね、力技ですが(汗)。

シューティングは色々な方が研究されているので
『当たり判定』で検索しても色々な方法が見つかると思います。



Popint

リンク

2008/6/9(Mon) 19:50:52|NO.16617

線分交差がありましたか…
移動した跡を線分として扱うのは思いつきませんでした。
これが一番簡単そうですね。

ご教授、ありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.