パドルでボールを打ち返します。パドルとボールの当たり判定は図4-13を参照してください。ボールが上から落ちてきて縦方向の位置(ボール中心のY座標)が

画面高さ - padH - ballRad

となったときに、横方向の位置(ボール中心のX座標)が

padX 以上 (padX + padW)以下

ならばボールの縦方向速度「spdY」を「-1」にする、という方法で良さそうです。

図4ー13 ボールとパドルの接触

上の関係をプログラムします。3個の条件

・posY = ( 画面高さ - padH - ballRad )          (A)

・posX ≧ padX                        (B)

・posX ≦ ( padX + padW )             (C)

を同時に満たすことをプログラムで表現する方法はいくつか考えられますが、ここではこのようにしてみました。

「もし (A) なら」

YES → 「もし (B) かつ (C) なら」

   YES → spdY = -1

   NO → 何もしない

NO → 何もしない

あるいは、

「もし (A) かつ (B) かつ (C) なら」

YES → spdY = -1

NO → 何もしない

でもOKです。「かつ」というのは「両方当てはまる」という意味です。

例)「東京都民」かつ「中学生」 →  東京都に住んでいる中学生

ここでは使いませんがもうひとつ「または」というのがあります。こちらは「少なくともどちらか一方が当てはまる」となります。

例)「東京都民」または「中学生」 →  全東京都民と日本中の中学生全員

図4-14を参考に関数「bounceBall」の中にブロックを追加してください。「かつ」のブロックは「論理」カテゴリ―の中にあります。

posY = ( 画面高さ - padH - ballRad ) のところが、

posY ≧ ( 画面高さ - padH - ballRad ) となっていますが、これはボールのY方向スピードとパドルの高さ寸法によってはボールがパドルの上面にぴったり載らない場合もあるのでその対策です。また( 画面高さ - padH - ballRad ) の引き算ですが、連続して引き算をするブロックがありませんので( ( 画面高さ - padH ) - ballRad ) のような形にしています。また「かつ」のブロックが横に長くなりすぎましたので、右クリックして「外部入力」として縦方向の入力になるようにしています。

「もし~実行」のブロックの中にさらに「もし~実行」ブロックが入っていますが、このような構造を「入れ子」と呼びます。

もう1箇所、パドルでボールを打ち損なってボールが画面下に到達したときにはそこでゲームを終了するように変更します。変数「spdY」に「-1」を代入していたブロックを削除して、代わりに「Arduino」→「その他」の中にある「プログラムを終了」ブロックを接続します。

これで「PONG」ゲームの基本機能のプログラムは完成です。プレイしてみて簡単すぎると感じた場合は、ボールのスピードを速くする、パドルを小さくするなどの変更をしてみてください。最後に効果音と点数表示を追加します。

図4ー14 パドルでの跳ね返りプログラム

図4ー15 パドルでの跳ね返り(実行画面)

インデックス
4-(5)効果音と点数表示