【ウディタ】初心者向けテクニック3(当たり判定)

1.当たり判定


キャラが敵と接触している、
あるいはキャラに攻撃がヒットしている、
などのいわゆる当たり判定は
ゲームではとても大事な要素ですね。

ウディタの場合、マップイベントでは
「プレイヤー接触
「イベント接触
を選ぶことができます(図1-1)。

f:id:ashutaru1552:20190725195841j:plain
図1-1

ですが、今回はキャラクターイベントを使わず、
ピクチャによる当たり判定を説明します。

2.当たり判定の考え方


シューティングで考えてみましょう。
丸い自機に、同じく丸い攻撃がヒットしたとします(図2-1)。

f:id:ashutaru1552:20190725201729j:plain
図2-1

この図を見ても分かる通り、
自機と攻撃がちょうど接触する距離というのは、
自機の中心と攻撃の中心までの距離が
互いの半径の合計と同じになる時
なのです(図2-2)。

f:id:ashutaru1552:20190725202500j:plain
図2-2

つまり自機が攻撃と接触しているかどうかは、
下記の式が成立するかどうかで判定できるんですね。

(自機の半径 + 攻撃の半径) >= 自機の中心~攻撃の中心までの距離

「じゃあもし自機の半径が10で、攻撃の半径が20なら……
 自機の半径と攻撃の半径の合計は30で、それから……
 あれ、自機の中心から攻撃の中心までってどうやって出すんだ?

3.三平方の定理

三平方の定理というのは、直角三角形に対して
下記の式が成り立つという定理です。

辺(斜めの部分)の二乗 = 底辺の二乗 + 高さの二乗

実は自機と攻撃の中心座標を結び付けると、
ひとつの三角形が姿を現します。

f:id:ashutaru1552:20190725210601j:plain
図3-1

この三角形に三平方の定理をあてはめると、 下記のようになります。

(自機の中心~敵の中心までの距離)の二乗 =
  (攻撃x座標 - 自機x座標)の二乗 + (攻撃y座標 - 自機y座標)の二乗

そういえば、自機の中心~敵の中心までの距離が
自機の半径 + 攻撃の半径とイコールになるとちょうど接触しているんでした。

つまり下記の式が成り立つ時、
ちょうど自機と攻撃が接触していることになります。

(自機の半径 + 攻撃の半径)の二乗 =
  (攻撃x座標 - 自機x座標)の二乗 + (攻撃y座標 - 自機y座標)の二乗

4.ここだけ覚えよう


何か定理とかめんどくせーし話なげえんだよと思う方は
ここだけ覚えておきましょう。

(自機の半径 + 攻撃の半径)の二乗 >=
  (攻撃x座標 - 自機x座標)の二乗 + (攻撃y座標 - 自機y座標)の二乗

これが当たり判定の条件式です。
成立する時は接触していることになるし、
成立しない時は接触していないことになります。

5.当たり判定(ウディタ)


では、自機の座標が(60, 60)で
攻撃の座標が(70, 80)の場合を考えてみましょう。
自機の半径は5、攻撃の半径は15とします。

(5 + 15)の二乗 >= (70 - 60)の二乗 + (80 - 60)の二乗
   ↓
20 * 20 >= 10 * 10 + 20 * 20
   ↓
400 >= 100 + 400

どうやら接触していないようです。
実際のウディタ画面で見てみても
接触していないのがわかりますね(図5-1)。

f:id:ashutaru1552:20190725214457p:plain
図5-1

では、攻撃の座標が(60, 80)の場合を考えてみましょう。

(5 + 15)の二乗 >= (60 - 60)の二乗 + (80 - 60)の二乗
   ↓
20 * 20 >= 0 * 0 + 20 * 20
   ↓
400 >= 0 + 400

ちょうどぴったし接触しているようです。
実際のウディタ画面で見てみても
接触しているのがわかりますね(図5-2)。

f:id:ashutaru1552:20190725214733p:plain
図5-2

形が複雑になるともう少し色々考えないとだめですが、
円形の当たり判定であればこんな感じで判定出来るので、
シューティングゲームなどに活かすことが出来そうですね。