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

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

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

Processing 入門

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

 

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

 

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

 

 

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

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

 

自機と玉の当たり判定

 

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

自機と玉で使う変数

 

実行しましょう。
自機を使って玉を跳ね返してみましょう。

自機で玉を跳ね返す

 

 

当たり判定の欠点

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

 

自機で玉を跳ね返す

 

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

玉の色を赤にする

 

 

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

当たり判定の欠点

 

 

欠点を直す

玉が自機の中へ入ってしまうバグ(不具合)を直します。
解決方法は…
玉が自機と当たったとき、かならず上に跳ね返すだけでOKです。

 

必ず玉を上に跳ね返す

 

Math.abs( ) を使って、変数 spdy の絶対値を取ります。(79行目)
絶対値とは符号を取り去ることで、正の数ならそのまま、負の数なら正の数になります。

そして、その値を負の値にします。
これで玉は上に移動します。

 

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

 

 

まだ欠点は残っている

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

 

玉の速度によって自機をすり抜ける時がある

 

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

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

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