GO-AHEADの日記

GO-AHEADで出版した書籍の紹介をします

Re5:50歳から始めるラズベリーパイ-12

Re5:50歳から始めるラズベリーパイ

簡単なゲームで学ぶVBAプログラミング入門

amazon kindleを出版しました。


 3.7 ブロック崩しゲームの作成-2

(3)ボールの動作
・ボールの基本動作
 ボールの動作について考えてみましょう。ボールはある速度と方向を持ち、一定の方向に進んでいます。
 図のように、x軸方向に角度θをもってx-y平面上を移動します。ボールを画面上に描画するには、位置(x,y)を知る必要があります。

f:id:GO-AHEAD:20200324163252p:plain

位置(x,y)は次式で計算できます。

$x=x_0+v \cos \theta$

$y=y_0+v \sin \theta$

 よって、ボールの移動は次のようになります。
bx = bx + bv * Cos(th / 180 * pi)
by = by + bv * Sin(th / 180 * pi)
※y軸は下方向が正なので注意が必要です。また、ラジアン表記なので度°をラジアンに変換してください。

 

・ボールの反射
 次にボールがラケットやブロック、壁に当たったときの反射について考えてみます。

f:id:GO-AHEAD:20200324163415p:plain

 この図に示すように、上側、下側に当たった場合の角度は
-θとなります。
 次に、横の壁にあった場合について考えると、図のようになり、180°-θとなります。

f:id:GO-AHEAD:20200324163426p:plain




よって、プログラムは次のようになります。
thがθです。

'反射する
'左右反射は180-θ
If (bx < 1 Or bx > 20) Then
  th = 180 - th
End If

'上下反射は-θ
If (by < 1) Then '一番上
  th = -th
End If

'ラケットがあったら反射-θ
If (by > 19 And rx <= Int(bx) And rx + 3 >= Int(bx)) Then
  th = -th
End If


・ブロックにボールが当たったとき
 これは、1マスが1ドットとドットが荒いので、動きがおかしくなりますが、次に進んだときにブロックがあれば、そのブロックを消して、反射するということにしました。

'進行方向にブロックがあったら反射&ブロックを消す
i = int(bx + bv * Cos(th / 180 * pi))
ii = int(by + bv * Sin(th / 180 * pi))-2

If (ii <= 6 And ii >= 0) Then
  If (block(ii, i) = 1) Then
    block(ii, i) = 0
    th = -th
  End If
End If

※横から、ブロックにボールが当たることは考えません。