初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

Small Basic 入門

22.メテオゲームを作ろう その4

 

[ メテオゲームを作ろう その3 ] の続きです。

隕石を表示するところまで行いました。次は自機と隕石の当たり判定です。
おっと、その前に当たり判定について学習しましょう。

 

 

2点間の距離による当たり判定とは

自機と隕石との当たり判定は、2点間の距離による当たり判定を使います。

自機の中心から隕石の中心までの距離を測り、この距離が隕石の半径よりも小さいときに当たりと判定します。

2点間の距離を測って当たり判定を行う方法

 

隕石が丸いため、この方法が適しています。
前回の「すべて拾い集めようゲーム」のように四角で判断すると、斜めから近づくと接触していないのに「当たり」となってしまいます。

2四角の当たり判定は適していない

 

ところで「どうして自機を点で当たり判定するのか」と思う人もいるでしょう。
今回のゲームでは弾を撃ちませんが、シューティング系のゲームは
敵の当たりは大きく、自機は小さく、というパターンが一般的です。
その方が面白くなりやすいので取り入れました。

もちろん、自機の絵と同じ形で当たりを判定するゲームもあります。
注意しなければならないのは、当たり判定の大きさではなく
どのような設定がゲームを面白くするのかなのです。

 

 

2点間の距離で当たり判定してみよう

当たり判定の仕組みについては、次を参照してください。

2点間の距離による当たり判定

 

次のプログラムは当たり判定用のサンプルです。
課題のプログラムと違うファイル名にして、同じフォルダに保存してください。

当たり判定のサンプルプログラム

2点間の距離を算出しているのは 23 行目です。
計算結果を2乗のままにしているので、比較対象の半径も2乗します。(24行目)
こうすることで平方根の計算をせず判定できます。

距離の算出に、それぞれの中心座標を使っています。
絵の中心を使う理由については [ 絵の中心点(基点)について ] を参照してください。

 

サンプルを実際に動かしてみてください。
どの角度から近付いても正確に判定されます。

当たり判定を確認する

 

 

当たり判定の処理を入れよう

課題のプログラムに当たり判定を入れます。

隕石と自機の当たり判定を入れる

18行目、変数 radius は隕石の半径です。隕石の絵の幅が 130 なので2で割ります。
44行目、絵を拡縮させた後の半径を変数 eSize[ i ] に入れます。

当たり判定は2点間の距離で判定

当たり判定の仕組みは、サンプルとほぼ同じです。
隕石は複数あるので For 文の中で1つずつ当たり判定を行います。
注目する点は変数 hit です。
判定をおこなう前に hit =0とします。(54行目)
70行目で hit が0のときのみ当たり判定をしています。
当たったときは hit=1にします。
つまり、1回でも当たったらその後の判定を行いません

 

それでは実行してみましょう。
隕石と自機が重なったとき、タイトルに「あたり」と表示されます。
しかし、動作が早くてしっかり確認できないですね。

 

 

動作を確認しよう

プログラムが正常に動作しているか確認することは大切なことです。
ですが、つい手を抜いてしまうという人も多いようです。

今回は隕石を動きを好きなときに止めて、自機との当たり判定をしっかりと確認する方法を説明します。

 

次のように、2箇所変更します。

動作を確認する為にプログラムを変更する

57行目 Mouse.IsLeftButtonDown でマウスの左ボタンが押されているかチェックします。
押していないときは 59 行目が実行されるので隕石は落下します。
押すと隕石が止まります。

ついでに 85 行目で自機のy座標も読み取り、画面全体どこでも動けるようにします。

動作を確認しやすい状態にする

実行して隕石が出現したら、好きなタイミングでマウスの左ボタンを押しっぱなしにしてください。
自機を動かして隕石と重ね、当たり判定が正常にうごいているか確認しましょう。

チェックが終わったらプログラムを元に戻します。