前回までのあらすじ:画像として形が与えられ、奇妙なノイズをも振り切った主人公と敵に、対決のときが迫る。衝撃のクライマックス!!
11.ゲームオーバーを作る
死のない人生など生きているとは言えません。…といえるほど人生生きたわけではありませんが。
ゲームも、終わりを作って初めてゲームとして成り立つのです。
このゲームの場合、敵キャラにぶつかってゲームオーバーになることが「終わり」となりそうです。
しかし、ぶつかるとはいっても、アホな忠実なActiveBasicのこと、何かはっきりとした基準をActiveBasicにもわかるように説明しなければならなさそうです。
ぶつかるということは、2つの物体の間の距離が0となること…なのでしょうか。
しかし、物体とはいっても、今はXとYの座標やら何やらを画像でそれっぽく見せているわけで、そこに物体としての実体はないのです。あったらあったでかえって難しそうですし。
そういえばいつか中心をマイキャラの位置にするって言ってましたね。ということは真ん中同士でいろいろ比べてぶつかっているかどうかを判断させればよさそうです。
ということで、敵と自分の中心の2点間の距離がある数値より小さければぶつかったとみなしてよさそうです。
X座標とY座標の2点間の距離といえば三平方の定理の出番です。
(距離)2 = (X座標の差)2 + (Y座標の差)2
はい、三平方の定理がわからなければ数学の教科書を開くなり先生に聞いてみるなり検索するなりしてみましょう。
まあ要するにこの数値が一定より小さければぶつかっているということです。
If (MyCharaX-Enemy[n].X)^2 + (MyCharaY-Enemy[n].Y)^2 < HITSIZE Then
Hit = 1 '当たってました...
End If
Hitは先に Dim Hit As Long で使うことにしておいて、Hit = 0 だと当たっていない、Hit = 1 だと当たっている、ということにしています。
こいつをHitCheckなる関数の中に入れておいて、最後に HitCheck = Hit とすることで当たったかどうかを関数の呼び出し元に教えてやります。
そして呼び出し元はこれを・・・・忘れてた!
今回はメインループから呼び出してみます。
そうそう。今更だけど、HITSIZEは定数で、1000ぐらいの数値を入れておきます。
メインループで、HitCheck = 1 かどうかを調べて、もしそうだったらゲームオーバーということにして終了。これでどうでしょう。
Function MainOperation(dwDummy As DWord)
GameInit() '初期化
While 1
MyCharaMove() 'マイキャラ動かす
EnemyMove() '敵キャラ動かす
If HitCheck() = 1 Then '当たったかどうかを教えてもらって
'当たってたらゲームオーバーとしてメインループ終了
Exit While
End If
PaintScene() '画面描画
WaitFrame() '時間まで待つ
Wend
'メインループが終わったらゲームオーバー
GameOver()
End Function
GameOverの内容は、何のことはない、「あなたはしにました。」のメッセージボックスを出すだけなので省略します。