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

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

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

Processing 入門

16.ブロック崩し3 自機との当たり判定

 

今回は「ブロック崩し2 壁との当たり判定」の続きです。

前にも言いましたが「ブロック崩し」は初心者向けの題材ではない
と思っています。
理由の1つとして、当たり判定を沢山しなければならない点があります。
そんな訳で今回も当たり判定の説明が中心です。

 

 

自機との当たり判定をしよう

玉と自機との当たり判定をします。
仕組みは「みどりを救え」ゲームのときと同じです。
どちらかといえば、よりシンプルになっています。

 

自機と玉との当たり判定

 

 

それぞれの変数を図で見てみましょう。
自機の領域(幅や高さ)と、玉の中心点 bx, by で当たり判定をしています。
つまり、玉の幅や高さを無視した1ドット判定です。
これが当たり判定をシンプルにしています。

 

当たり判定の図

 

 

実行しましょう。
自機を使って玉を跳ね返せるか確認しましょう。

 

自機を使って玉を跳ね返せるか確認しよう

 

 

当たり判定の欠点

自機と玉との当たり判定を作りました。
しかし、正しく動かない時があります。
現象としては、自機の側面に当たった玉が内部に入り込んでしまうのです。
何度か跳ね返りながらやがて外へ出て行きます。
次のような感じです。

 

自機と玉との当たり判定に欠点がある

 

 

玉を赤に変更して現象を確認しましょう。
プログラムは次のように変更します。
59行目、もとのプログラムをコメントにし
60行目でカラーを赤に設定します。
テストが終わったら60行目を消して、59行目のコメントを取ります。
このように、もとの状態を残しながらテストするのが一般的です。

 

玉を赤くしてチェックする

 

 

しかし何故このようなことになるのでしょうか。
その原因は、当たり判定をシンプルにしたことにあります。
玉が自機と当たったときy軸の向き(spdy の符号)を逆にしただけなので
側面から入り込むと、跳ね返ったあとも自機から出られない場合があり
また当たり判定に引っ掛かってしまうのです。

 

自機の外へ出れなかった玉は、また当たり判定に引っ掛かる

 

 

欠点を直す

玉が自機の中へ入ってしまうバグ(不具合)を直します。
解決方法としては・・・
玉が自機と当たったら、2度目の当たり判定を行わないようにすればいいのです。
1つフラグを作り、1度当たったら2度目の判定をしないようにします。

 

自機の中へ入るバグを直す

 

変数 phit を追加します。
自機と当たったら0から1にします。(83行目)
このフラグが0のときだけ当たり判定をするようにします。(80行目)

このフラグを1にしたままだと2度と当たり判定をしてくれないので
玉が自機の外にいることを確認できたらフラグを0にします。(87行目)

修正が終わったら実行して、玉が側面から入っても1度で跳ね返るか
ちゃんと確認しましょう。
それから、確認が終わったら玉の色を白に戻します。

 

 

まだ欠点は残っている

実は、まだ欠点は残っています。
玉の移動を速くすると、自機をすり抜けてしまう場合が出てきます。
次の画像のように自機を飛び越えてしまうのです。

 

玉の移動が速いと自機をすり抜けるときがある

 

今回の制作では、玉の移動速度を変更しないので何もしません
いつかプログラミングスキルが上がったとき挑戦してみて下さい。

ちなみに対策するときの例です。
・玉が自機の近くに来たら、移動ルートを細かく分割して当たり判定を行う。
・1次関数を使って判定する。四角の角(4点)の座標が、1次関数の直線を
またいでいたら当たりとする。

中学のときの勉強が、こんな所で役に立ちますね。