円同士の当たり判定を行うには

◆PROCESSING 逆引きリファレンス

 カテゴリー:ゲーム作成

円同士の当たり判定を行うには

【解説】

多くのゲームでは、物と物が衝突したかどうかを判定する処理(当たり判定)は定番ですね。

例えばシューティングゲームでは、敵と弾が衝突したかどうかを判定し、しかるべき処理を行います。

ゲーム専用のフレームワーク(UnityやCocos2d-X)では、専用の当たり判定命令が用意されています。

残念ながらPROCESSINGには、当たり判定を行う便利な標準命令はありません。

無いものは作るしかないというわけで(笑)、ここでは画面上に登場するキャラクターを囲む円を用いて、円同士の当たり判定を行う方法について解説したいと思います。

キャラクターを囲む円とは、以下の様なものです。

内接円(画像URL:illust-AC 様:うーさん)

青い円が「キャラクターを囲む円」です。そして、円同士の衝突は以下のようなイメージになります。

collisionCircle
(画像URL:illust-AC 様:うーさん、kaeru-yaさん)

この場合、UFOと砲弾を囲む円が衝突しているか(触れているかどうか)を判定します。円同士が触れているかどうかは、中学校で習う三平方の定理を用いれば計算可能です。
円の衝突計算
上記式で求められる結果が、円Aと円Bの半径同士を足した長さ(距離)よりも小さければ、衝突している事になります。

 

【構文】

float   s  =  sqrt (  float  n   ) ;
float   t  =  sq    (   float  f    ) ;

 

【パラメータ】

s : 平方根の結果
n : 平方根の対象数
t : 二乗した結果
f : 二乗する対象数

 

 【注意】

sqrt() は平方根を求める命令です。sqrt( 2 ) なら 1.4142135 が戻されます。

sq( ) は与えられた数を二乗する命令です。 sq( 3 ) は 3 × 3 と同じ意味になります。

 

【関連記事】


サンプルプログラム

当たり判定例1:

上記を実行すると、バスケットボールとサッカーボールが画面中央で衝突して跳ね返ります。

LEFTとRIGHTはPROCESSINGが標準で持っているグローバル定数で、左か右かを判別するのに利用しています。

記事で紹介した衝突判定の計算を行っているのは isCollisionCircle() 関数になります。sqrt( sq(dx) + sq(dy) ) と書かれた部分が今回のポイントとなる計算式です。

上記サンプルは data フォルダ配下に

  • basketball.png:バスケットボール画像(64×64)
  • soccerball.png:サッカーボール画像 (64×64)

が格納されている前提です。

また当たり判定部分については、双流蒼天歌 様のブログを参照させて頂きました。

<出力サンプル>

CollisionCircle1(画像URL:pixabay 様)

 

当たり判定例2:

ちょっとしたミニミニゲームですね(笑)。

上記を実行すると画面下中央に固定砲台が表示されます。左上から現れるUFOめがけて弾を発射してください。弾は何かのキーを押すと発射されます。

isCollisionCircle() が今回紹介した円同士の衝突判定を行っている関数です。弾がUFOに命中すると、UFOと弾が消失します。

上記サンプルは data フォルダ配下に

  • ufo.png :     UFO画像(64×64)
  • cannon.png :砲台画像(64×64)
  • ballet.png :砲弾画像(48×48)

が格納されている前提です。

また当たり判定部分については、双流蒼天歌 様のブログを参照させて頂きました。

<出力サンプル>

CollisionCircle2
(画像URL:illust-AC 様:うーさん、kaeru-yaさん、acworks さん)

下記はサンプルプログラムをP5.jsで書き直したものです。マウスクリックすると動作イメージを確認できます。

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。