スカッシュ・ゲームを作ろう その2(2/2) |
4.バーとボールの当たり判定 |
当たり判定とは、物と物が当たっているかどうかを判定することです。ボールの絵とバーの絵とで、そのままの形で当たり判定を行うのは非常に困難です。そこでボールは16×16、バーは64×16の矩形に近似して行います。
ボールのx座標は、左端がball_x、右端がball_x + 15です。バーのx座標は、左端がbar_x、右端がbar_x + 63です。ボールがバーに当たっている時、x座標はball_x + 15がbar_x以上で、かつ、ball_xがbar_x + 63以下です。
ボールのy座標は、上端がball_y、下端がball_y + 15です。ボールとバーが接している時、ボールの下端がバーの上端より1ドット上(上図の赤い線)にあります。しかし、ball_speedの値によってはその位置には来ず、バーにめりこんでしまいます。
そこで、ボールのどこかが赤い線に当たっていれば、当たりと判定します。つまり、ball_y + 15がbar_y - 1以上で、かつ、ball_yがbar_y - 1以下の時です。
ボールがバーに当たったら、打ち返しの処理をします。
;バーとボールの当たり判定 if ball_x + 15 >= bar_x & ball_x <= bar_x + 63 & ball_y + 15 >= bar_y - 1 & ball_y <= bar_y - 1 { ball_y = bar_y - 16 ball_pmy = -1 score += 100 hit_cnt++ if hit_cnt == 5 { if ball_speed < 8 { ball_speed++ } hit_cnt = 0 } mmplay 0 }
ball_y = bar_y - 16
ball_yを強制的にbar_y - 16に(ボールがバーに接している状態に)します。
hit_cnt++ if hit_cnt == 5 { if ball_speed < 8 { ball_speed++ } hit_cnt = 0 }
hit_cntを1増やします。5になったらball_speedを1増やし、hit_cntを0に戻します。ただし、ball_speedの上限は8とします。
5.ボールを落とした時の処理 |
ボールのy座標が画面下端より下になったら、fall_fを立てます(フラグを1にすることを「フラグを立てる」と言います)。
;ボールを落とした時の処理 if ball_y >= 480 { fall_f = 1 }
6.画面の更新 |
画面の更新処理にボールの描画とスコアの表示を追加します。
;ボールの描画 pos ball_x, ball_y gmode 2 celput 2 ;スコアの表示 msx = 0 : msy = 0 message = "SCORE:" + score gosub *Write_Message
7.ゲームオーバー処理 |
画面の更新処理の直後にゲームオーバー処理を追加します。
;ゲームオーバー処理 if fall_f == 1 { mmplay 2 wait 200 msx = 272 : msy = 232 message = "GAME OVER" gosub *Write_Message wait 300 goto *Title_Screen }
fall_fが立っていたら、「ブ、ブー」という音を鳴らし、2秒待ち、"GAME OVER"と書き、3秒待ち、タイトル画面に戻ります。
await命令では込み入った説明をしましたが、ただ単に待つだけなら
wait 待ち時間(10ミリ秒単位)
とします。
この処理はボールを落とした時の処理でやってもいいのですが、その場合ボールが画面下端からはみ出したことが画面に反映されません。そこでフラグを立てておき、画面を更新した後にフラグが立っていたらゲームオーバー処理を行うようにしています。
長くなってきたのでプログラム全体を掲載するのは省略します。どこにどう追加したのかは、サンプルをダウンロードしてご確認ください。
補足 |
・初期位置のボール |
このサンプルでは「ゲームスタート時の初期設定」でボールの初期位置を設定していますが、すぐに移動処理を行うため、初期位置にある時のボールは描画されませんが、良しとしています。 |
・画像の重ね合わせ |
バーを移動させたらバーを描き、ボールを移動させたらボールを描く、という書き方もできるのですが、描画は一か所にまとめています。なぜかというと、画像の重ね合わせを気にするからです。後に描いたものほど上に(手前に)表示されます。シューティングゲームを例にしますと、自機を描画した後に背景を描いてしまったら、自機が消えてしまいます。それはすぐに分かると思いますが、敵と敵の弾が重なった時に、どちらを上に描くかはちょっと迷いますよね。描画を一か所にまとめておけば、後で並べ替えるのは簡単です。 |
・効果音 |
効果音(SE : Sound Effect)は、フリー素材を探すのが手っ取り早いと思います。波形をいじらなければならないので、自分で作るのは非常に難しいと思われます。 |