![ブロック崩し パドルにボールをめり込ませないようにきれいに跳ね返す方法_m](https://tsunekichiblog.com/wp-content/uploads/2020/12/7fd5a4fa404b667704c6593d20aa6e7e-1024x538.jpg)
Scratchのゲーム作品について調べていると、必ずと言っていいほどブロック崩しゲームに出会うのではないでしょうか?
もしくは腕試しにブロック崩しゲームを作ってみようとテーマに選んだという人もいるかもしれません。
ブロック崩しゲームで最初に手こずるのは、ボールがブロックやパドルに当たったあとの跳ね返りのプログラムの部分だと思います。
そこで今回は、ボールがパドルに当たったときにきれいに跳ね返すスクリプトを作ってみます。
この記事を読んでいただくと、ボールがパドルに当たってきれいに跳ね返るスクリプトの作り方と失敗しやすいポイントが分かります。
スクリプトの作り方
完成した動き
ボールがパドルに当たった後、きれいに跳ね返っているのが分かると思います。
今回のスクリプトでは、跳ね返す角度は単純に「180-(ボールの向き)」にしています。(跳ね返る角度を工夫したやり方は別の記事に書いています)
このプログラムでは、上から当たっても下から当たっても、パドルの表面で跳ね返るような動きになってます。
![ブロック崩し パドルにボールをめり込ませないように跳ね返す方法GIFアニメ](https://tsunekichiblog.com/wp-content/uploads/2020/12/3c09a8f3fcb0eebd5422f238f55952af.gif)
完成したスクリプト
スクリプト全体です。スプライトはボールとパドルの2つありますが、パドルの方は単純なプログラムです。
ボールのスクリプトのところにコツがあります。
【ボールのスクリプト】
![](https://tsunekichiblog.com/wp-content/uploads/2021/09/image-206.png)
【パドルのスクリプト】
![](https://tsunekichiblog.com/wp-content/uploads/2021/09/image-207.png)
スクリプトの説明
ポイント①:初期化処理など
特に説明は不要だと思います。初期設定などで何てことない部分です。
【ボールのスクリプト】
![](https://tsunekichiblog.com/wp-content/uploads/2021/09/image-211.png)
【パドルのスクリプト】
![](https://tsunekichiblog.com/wp-content/uploads/2021/09/image-207.png)
ポイント②:パドルに触れたら向きを変える
この部分から重要です。まずはパドルに触れたら、反射する向きだけを決めます。
ここではシンプルに「180度-(ボールの現在の向き)」としています。
こうすると、水平になっているパドルに対して入射角=反射角になります。
【ボールのスクリプト】
![](https://tsunekichiblog.com/wp-content/uploads/2021/09/image-214.png)
Scratchの向きは、真上が0度・真下が180度で時計回りです。ただし、Y軸を中心に右半分が+の範囲、左半分が-の範囲になります。例えば、180度を超えると181度としても計算はできますが、-179度という表記になります。
![Scratchの角度指定](https://tsunekichiblog.com/wp-content/uploads/2020/12/1264334fe410b6764a9a7575c7b1fbc1.png)
ポイント③:パドルから離れるまで動かす
ポイント②のところで決まった方向に向かって、ボールがパドルから離れるところまで動かします。
この部分をスクリプトの入れることによって、どの方向でもパドルの表面まで動いてくれるようになります。
【ボールのスクリプト】
![](https://tsunekichiblog.com/wp-content/uploads/2021/09/image-215.png)
ポイント④:パドルに触れてない間の動きも忘れずにつくる
スタート直後やパドルに触れていない間も動き続ける必要があるので、この部分のスクリプトも忘れずに作らなければいけません。
【ボールのスクリプト】
![](https://tsunekichiblog.com/wp-content/uploads/2021/09/image-216.png)
これらのスクリプトブロックを作れば、パドルで跳ね返る動きは完成です!
失敗しやすいポイント
スクリプトを組むにあたっては、失敗しないようにいくつか注意点があります。
失敗パターン①:パドルに絡まってしまう
よくあるパータンが、パドルに当たったあとにパドル上でハンチングしたようにガタガタと上下に動き続けてしまう現象です。
これは、上で説明した「パドルから離れるまで動かす」の処理が組み込まれてないのが理由です。
この部分が無いと、「パドルに触れて○○歩動いた」としてもまだパドルに触れている場合があるためです。
パドルに触れていると、また向きを変えて、また○○歩動く、でもまだパドルに触れている、このような状態に陥ってしまうことがあります。
![ブロック崩し パドルにボールをめり込ませないように跳ね返す方法GIFアニメー失敗](https://tsunekichiblog.com/wp-content/uploads/2020/12/e6b69a91ba5f64f1707d9fe553ba81a6.gif)
![](https://tsunekichiblog.com/wp-content/uploads/2021/09/image-212.png)
失敗パターン②:実は側面が弱点
こちらは、失敗パターンというより補強するポイントになります。
上に示した完成形のスクリプトでも、実はまだ弱点があります。
それはパドルの側面からボールがぶつかったときに、ボールがパドルをすり抜けてしまうというものです。
これまで作ってきたプログラムは、上面または下面からボールがぶつかったときに跳ね返す場合のプログラムだったのです。
これを防ぐには、「パドルの上面・下面に当たった場合」と「パドルの側面に当たった場合」の場合分けが必要になります。(詳しくはまた別の記事にしようと思います)
応用編
上で説明した内容は、パドルが水平に保たれている状態でしたが、ここではパドルの傾きが変わっても同じ条件でボールが反射する角度を維持するという内容をやってみたいと思います。
反射角を求める数式は以下のようになります。
$$(パドルの向き-90度)*2 + (180度-ボールの向き)$$
※スペースキーでボールを動かします。パドルはマウスカーソルに追随します。
![ブロック崩し パドルにボールをめり込ませないように跳ね返す方法GIFアニメー応用](https://tsunekichiblog.com/wp-content/uploads/2020/12/8f6c6edd65a573ba66b2959d15ba3e14-1.gif)
まとめ
さいごに、ボールがパドルに当たってきれいに跳ね返るスクリプトの作り方のポイントについてまとめます。
- ポイント①:初期化処理など
- ポイント②:パドルに触れたら向きを変える
- ポイント③:パドルから離れるまで動かす
- ポイント④:パドルに触れてない間の動きも忘れずにつくる
どうでしたか?上手くできたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)