Small Basic 入門
28.ふらふらUFOゲームを作ろう その3
[ ふらふらUFOゲームを作ろう その2 ] の続きです。
谷と自機の当たり判定
自機が谷の壁に当たったかを判定します。
正確には、自機と重なる四角からはみ出たかを調べます。
次のように変更します。
59-65行目、自機と重なる四角を選び出しています。
重なっていたとき、当たり判定をするサブルーチン hitcheck を呼び出します。
なお、60 行と 62 行は Or を使って1行にできますが
画像におさめるため2行に分けました。
74行目、当たり判定をしています。
正確には、四角からはみ出している場合、当たっていると判断しています。
75-78行目のピンクの部分は、テスト用に追加したものです。
このあと制作を進めていく途中で削除します。
実行してみてください。
自機が壁に当たると動きが止まります。
ここでスペースキーを押すと、自機が谷の中央に移動してまた動き出します。
そのあと、壁に当たっても止まらなくなります。
(壁に当たる→中央に戻る→壁に当たる→中央に戻る、をくり返します)
これは LastKey が最後に押されたキーをずっと持っているためです。
スペースキー以外のキーを押せば、壁に当たったら止まります。
アクションゲームなど動きが早いものは、プログラムが正しく動いているか確認するのが困難です。
ピンクの部分のように確認するための処理も作って、しっかりと動作を確認する習慣をつけましょう。
当たり判定のしくみ
当たり判定の If 文をみると、なにを比較しているのか分かりにくいですね。
少しだけ解説します。
今回は2つの比較で当たり判定しています。
1つ目は、自機と重なっている四角を選び出す処理です。
60 行目と 62 行目のことです。
次の画像をみてください。
説明のため、自機と四角の大きさは変えてあります。
この場合のポイントは、自機の座標 py と高さを足した座標 py+ph の間に
四角の座標があるのか判断している所です。
四角の座標 vy[ i ] が間にあるか判断しているのが 60 行目です。
高さを足した座標 vy[ i ]+20 が間にあるか判断しているのが 62 行目になります。
どちらかの判断文に引っ掛かれば、自機と四角は重なっていることになります。
2つ目の判定、74 行目を見てみましょう。
自機が四角からはみ出しているか判断する処理です。
こちらはとてもシンプルです。
四角の左端 vx[ i ] より自機の左端 px が左にあればはみ出している
四角の右端 vx[ i ]+vw より自機の右端 px+pw が右にあればはみ出していると判断します。
どちらかの条件に当てはまればいいので Or を使っている点に注目しましょう。
やられ演出を入れよう
自機が壁に当たったときのやられ演出を入れます。
とりあえず、壁に当たったら画面外へ出て行くという簡単なものを作ります。
サブルーチン gameover を作りました。一番下に追加します。
76 行目、ここにはスペースバーを押して自機の位置を戻す処理がありました。
それを削除してゲームオーバー処理へ行くようにセットします。
114-116行目、やられ演出として自機を画面外へ移動させています。
114 行目で変数 mcnt を 720 以下としているのは、画面サイズが 640 なので
720 あれば確実に画面外へ出るからです。
制限している理由は、コンピュータに無駄な処理をさせないためです。
無駄な処理をさせると、時として予想もしないバグ(不具合)が発生します。
実行してみましょう。
壁に当たると右へ飛んでいきます。
やられ演出をもっと良くしよう
やられ演出が画面外へ移動するだけでは、つまらないですね。
もっとかっこ良くします。
その前に、自機が壁に当たったら右へ移動する仕様ですが、少しまずいです。
もし、画面の右端の近くで接触したら、自機がすぐに見えなくなります。
ここを修正します。
画面の右側で接触したときは左へ、左側のときは右へ飛んでいくようにします。
物を動かすとき、右へ移動させるなら座標はプラス方向へ
左へ移動させるなら座標はマイナス方向へ動きます。
変数 vec を作り、1 と -1 に切り替えることで進む向きを変えます。
つまり進む量 mcnt に vec を掛ける訳です。(121行目)
実行して、画面の両端で接触テストしてみて下さい。
それぞれ接触位置とは逆の方へ移動すれば成功です。
やられ演出を良くするパート2
やられたときの移動にもっと変化を付けます。
簡単なのが三角関数の sin を使った方法です。
三角関数を知らないときはネットで調べましょう。
121行目、Math.Sin を使って sin 波形を取得しています。
パラメータの単位がラジアンなので、円周率 Math.Pi × mcnt / 180 という式になります。
ラジアンを知らない人はネットで調べてみましょう。
122行目、変数 psin をy座標にプラスかマイナスすることで、sin 波形があらわれます。
今回マイナスにしたのは見栄えで選びました。
試しに py+psin に変更して見比べてみてください。
123行目、自機の絵を回転させています。
これをコメントにして実行してみてください。回転していたときとの印象の違いを見比べてみましょう。
これでやられた感が出てきました。