hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
衝突判定 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

衝突判定

シューティングといえばやっぱりこれが無いと。
 

サンプル

いきなりサンプルです。ならうより慣れろということで…?

  • 以下のサンプルでは自機との衝突判定を行います。判定は次の組み合わせが対象です。
    • 矩形と矩形
    • 矩形と線分

操作方法:キーボードのカーソルキーを使ってください。
hsp2.png

+  衝突判定サンプル

[hsp3] こちらに投稿されたものです。

+  衝突判定サンプル

アルゴリズム

線分と線分

Math/線分同士の公差判定

矩形と矩形

  • 「対角2点がもう片方の対角2点の外側にない場合、衝突している」としています。
  • 矩形の対角2点は通常、左上座標 - 右下座標として処理されます。
    あえて左下座標 - 右上座標のように指定すると通常とは異なる衝突判定を行います。
    (例:レーザーの上にある領域)
  • p3に1を指定すると対角2点が、左上座標 - 右下座標でなくても左上座標 - 右下座標としたときと同様の 判定を行います。
    p3に1が指定された場合、配列内の順番を左上座標 - 右下座標になるよう入れ替えています。

関連ページ:当たり判定モジュール

[hsp3]

+  矩形同士の衝突判定

矩形と線分

  • 矩形の四隅が線分の上にあるか下にあるかを調べ、全て同じ側にあれば衝突していません。
    1つでも違うものがあれば線分をまたいでいます。
  • 線分を対角線とした矩形領域内に自機が入っていなければ、線分と自機の衝突はありません。
  • スクリプト中の式は直線の式y=ax+bです。線分の両端2点が分かっているので連立方程式を解けば導くことが出来ます。

円と円(おまけ)

  • 円の中心どうしの距離を求め、それが半径の和以下ならば衝突しています。半径の和より大きければ衝突していません。

[hsp3]

+  円同士の衝突判定

円と直線(おまけ)

  • 点と直線の距離を求める公式(Math/Basic参照)を使う。
    円と直線の距離を求め、それが円の半径以下ならば衝突しています。

    円と線分の場合、中心から線分に垂線が引けるとは限らないので判定がややこしくなります。

[hsp3]

+  円と直線の衝突判定

拡張性皆無なスクリプトになってしまいました…orz

  • 矩形と矩形
    • 矩形にしか使えません…。しかも斜めに回転した矩形とかはダメ。
  • 矩形と線分
    • 線分との衝突判定を利用すれば、多角形図形の判定に使えそうですが…重くならないかな?
      いやすでに重いのかも…。
    • 放物線などの曲線ではどうするんだろう。同じことやっても衝突しない場合が出てくるし。例えば曲線の凸の部分が四隅の間を通って矩形内に入ることも考えられる。直線と曲線の判定をするのかな?うーめんどくさい。(-_-lll

処理速度がどうなってるか分からないので…プラグインを探して使ったほうが早くて扱いやすいと思います。(^ ^;
よいアイデアありましたら修正お願いします。

一般化への挑戦

  • モジュールからmgetcoli_blの一部変更とivouter2dを追加することで一般化への1stステップ。
    これなら直線で構成された形状なら何でも対応可能なはずです。
  • 処理の内容は、線分に対して各点が右にいるか左にいるかで判断します。
  • 右にいるか左にいるかの判断には外積を用います。
    使い方:上のモジュールから「mgetcoli_bl」命令の部分を削除して下の命令2つを入れてください。
    hsp2.png
    +  モジュール
コメント

  • 公式板でレーザーの話が出たので、(判定の話じゃなかったのですが)レーザーの衝突判定を作ってみたくなったので作ってみました。
    今回思いつきと勢いで作成したもので、人のスクリプトとか調べてません。もっと効率のいいやり方あるかもしれませんのでいい方法があったら適当に書き換えてくださいませ…m(_ _;)m -- GENKI? 2005-09-11 02:12:12 (日)
  • 皆さん気づかれているかと思いますが、僕は実際にゲームは作ったことありません^^;なので考え方は思いつくが実装法はそんなにバリバリ書けるってわけじゃないんですよねぇ・・・;;
    GENKIさんのスクリプトを読んで図に書いていろいろ追ってますよ。で矩形と矩形の衝突チェックだけ自分なりの方法できたのでコメントつけておきます^^
    mgetcoli_bb命令の定義内の「2点間で重なるかで判断」の処理を変えて、「対象となる範囲に自分がいなければいなければ当たっている」という考えのもと作った部分ソースがこんな感じです。
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
    
     
     
     
     
     
     
     
     
     
     
     
     
     
    
     /*
    	;2点間が重なるかで判断
    	if (bp1.0>bp2.0)&(bp1.0>bp2.2) & (bp1.2>bp2.0)&(bp1.2>bp2.2) !1 : fb++
    	if (bp1.0<bp2.0)&(bp1.0<bp2.2) & (bp1.2<bp2.0)&(bp1.2<bp2.2) !1 : fb++
    	if (bp1.1>bp2.1)&(bp1.1>bp2.3) & (bp1.3>bp2.1)&(bp1.3>bp2.3) !1 : fb++
    	if (bp1.1<bp2.1)&(bp1.1<bp2.3) & (bp1.3<bp2.1)&(bp1.3<bp2.3) !1 : fb++
    	if fb=4 : outstat = 1
    	return
     */
        ; 自分の四隅が対象より外でなければ当たっている(外にいれば1となるので!で否定しています)
        ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        if (bp1.0>bp2.2) | (bp1.2<bp2.0) | (bp1.1>bp2.3) | (bp1.3<bp2.1) ! 1 : outstat=1
        return
    これで出来てるハズ・・・。今度は矩形vs線を追います^^ -- kz3 2005-09-11 12:23:27 (日)
  • サンクス。でも残念これじゃだめっス。
    矩形の対角点はからなず左上・右下座標で指定するとは限らないからです。右上・左下座標で指定するかもしれない。
    これは実際にレーザーが左側にきたときに衝突しない現象で確認できます。
    それで先に左上・右下座標になるように並べ替えて(ソートして)おくべきだったかなーと。
    …しまったboxfはマニュアルでは左上、右下座標だった。説明まずいや。 -- GENKI? 2005-09-11 14:24:08 (日)
  • はい、気づきました。そこは線分処理側の最初に対角線をなす矩形を渡すときに座標変換して渡すとか・・・ -- kz3 2005-09-11 15:09:16 (日)
  • あ、並べ替えてって書いてましたね^^;失礼・・・矩形処理は他とそろえて左上座標-右下座標にしたほうがいいですよね -- kz3 2005-09-11 15:12:23 (日)
  • 重ねてサンクスです。スクリプト差し替えました。左上座標-右下座標になるよう並び替えるオプションをつけました。
    あえて左上座標-右下座標にしていない場合も考慮する形になりました。利用方法がいまいちないけど。^ ^; -- GENKI? 2005-09-11 17:45:16 (日)
  • なんか凄そうなので読んでみようと思います。 -- kz3 2005-09-17 09:18:20 (土)

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

楕円と点

楕円は2焦点から外周までの距離の合計が一定と言う性質を持っています。
そこで、2焦点から任意座標までの距離を算出することで、それが一定値以下なら楕円の内側、一定値以上なら外側として判定できます。
[hsp3]

+  楕円と点の衝突判定

楕円と楕円

簡単にできそうで、意外にに難問です。

ちなみに検索すると解法が見つかります。
http://marupeke296.com/COL_2D_No7_EllipseVsEllipse.html
見つかりますが、よく分かりませんでした。_| ̄|○

そこで、もう少しいい加減にやってみることにします。

マウスのほうの楕円が半径1.0の円になるように縦横比を変換。
円と楕円の判定という形にします。
楕円の方を外側に1.0だけ膨らませればいいのですが、難しいので単純に半長軸と半短軸に+1.0します。(この方法では1.0より近い場所も出てくるので正確さを求めることが出来ません。)
短径/長径が小さいと誤差が出やすいようです

ともかくこれで点と楕円の判定という形になりました。
あとは「楕円と点」で書いた方法で判定します。

[hsp3]

+  楕円と楕円の衝突判定

このスクリプトの場合、短径/長径が近い2つの楕円の判定であれば、小さい誤差で判定できます。

WinAPIを使用する [hsp3]

IntersectRect?を使用したものです。

+  当たり判定

対応する四辺が平行な矩形同士の交差判定

対応する四辺が平行な矩形同士の交差判定
上のコメントでkz3さんが書いていることの補足説明。


添付ファイル:
filest_sample01.as
804件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2013-05-29 (水) 15:11:57 (193d)