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

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

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

Small Basic 入門

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

 

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

隕石を表示するところまで行いました。次は自機と隕石の当たり判定です。

 

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

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

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

 

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

 

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

 

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

 

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

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

 

 

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

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

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

 

次のプログラムは当たり判定用のサンプルプログラムです。
課題のプログラムとは別のファイルにしてください

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

 

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

 

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

 

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

当たり判定を行うプログラム

 

 

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

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

 

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

 

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

 

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

 

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

 

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

 

 

動作を確認しよう

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

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

 

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

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

 

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

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

 

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

 

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

 

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