![見出し画像](https://assets.st-note.com/production/uploads/images/104130439/rectangle_large_type_2_621aa765c61b68aaa03c4b08eae1e379.png?width=1200)
PICO-8でブロック崩しを作ろう(ボールの反射角度をコントールする
今回はパドルの動きによって反射するボールの角度が変わるような実装をしてみます。
実際の物理法則を正確にシミュレーションする必要はなくそれっぽく動いてくれればいいので…ボールとパドルがぶつかって反射処理をおこなう際に、
パドルの動き(速度)とボールの動き(速度)が向かい合っている(相対)場合は反射するボールの角度が高くなる
パドルの動き(速度)とボールの動き(速度)が同じ方向(並走)の場合は反射するボールの角度が低くなる
みたいな実装をすればいけるのではないでしょうか?
いきなり実装した画面を表示しますが・・・
![](https://assets.st-note.com/production/uploads/images/103551211/picture_pc_9f8d82b7e565bd45cfb88a1f58bf5ead.gif)
![](https://assets.st-note.com/production/uploads/images/103551305/picture_pc_7ce4c0332e6bbcd9bd3eb122ceb0740a.gif)
serveball()
![](https://assets.st-note.com/img/1682030954953-C9pHLINXYd.png)
まずはserveball()にてグローバル変数ball_angを追加します。
ball_angは0〜2の値をとり、ボールの反射角度を示します。
![](https://assets.st-note.com/img/1682031245759-KVCAE4xBmU.png)
setang()とsign()
![](https://assets.st-note.com/img/1682032229104-K0PIK0S8ii.png)
setang()とsign()の二つの関数を追加します。
setang()はball_ang(0〜2)の入力値によってボールの速度ball_dx,ball_dyを変更する関数です(反射角の変更)。
sign()は入力値が0以下の場合は-1,それ以外の場合は1を返す関数です。
ボールの方向を保持するために使います。
--check if ball hit pad
![](https://assets.st-note.com/img/1682639491545-fOasFQ5BeX.png)
update_game()内のボールとパドルの衝突処理の箇所でボールの反射角度の変更処理を追加します(黄色枠)。
パドルが動いてる(pad_dx>2)ときに
・パドルとボールの動いている方向が同じならball_angを-1
・パドルとボールの動いている方向が逆ならball_angを+1
します。
このときmid()関数を使ってball_angが0〜2の範囲を超えないようにします。
本日の成果物
この記事が気に入ったらサポートをしてみませんか?