2019年06月10日

ActiveBasicとDXライブラリでゲームプログラミング!~第8回・追いかけゲームを作ってみよう!その3

n88_reon.gif
玲音:どうもこんにちは! B-Maga編集部の紅一点、玲音です!

n88_kaede.gif
楓:こんにちは! その玲音先輩に講座に引きずり込まれた楓です!
ところで先輩、編集部には妹弟子Aちゃんもいるし、私もいますから、紅一点というのはおかしいんじゃ……

n88_reon.gif
わーわー! 楓ちゃん、それを言ったらダメだよ!
それに、引きずり込んだなんて、人聞きが悪いってばっ。

n88_kaede.gif
えへへ……。それじゃ先輩、今回もいってみましょうか。

n88_reon.gif
う、うん、そうだね。
こほん、今回は、スピードの調節の方法、追いかけゲームでSgnをどうやって使ってるか、そして敵とぶつかった判定をやっていくよっ。

~dxWaitTimerでスピードを調節しよう!~

n88_reon.gif
さてさて、まずはスピードを調節する方法ですが、それにはdxWaitTimer関数を使いまーすっ。

n88_kaede.gif
dxWaitTimerですかー。

n88_reon.gif
うん。さっそく使ってみるよ。サブプロシージャGameProc()の中の、End Subの前当たりに、次の一行を入れてみて。

abdx1906-a01.JPG

abdx1906-p01.JPG
▲ 入れた後のGameProcはこうなります。

n88_reon.gif
入れてみたら、さっそく動かしてみてね。どうかな?

n88_kaede.gif
あっ、ちょうどいいスピードになっています! これぐらいなら遊べそうです!

n88_reon.gif
良かった良かった。さて、このdxWaitTimerは、指定された時間、プログラムの動きを止める関数なの。止める時間は、( )の中の引数で指定できるよ。ちなみに単位はミリ秒単位ね。

n88_kaede.gif
ミリ秒単位?

n88_reon.gif
うん。1/1000秒をミリ秒というんだよ。つまり、今回の場合だったら、一回の処理が終わるたびに、100ミリ秒……つまり、0.1秒の間、時間を止めてるわけ。

n88_kaede.gif
なるほどー。

~Sgn関数をどう使う?~
n88_reon.gif
さて、Sgn関数だけど、これは( )の中が0より大きければ+1、小さかったら-1を返す関数だってことは、前回話したよね。

n88_kaede.gif
はいっ。それで、これをどう使ってるんですか?

n88_reon.gif
その前に前提として、例えばX座標の場合、自分が敵の右にいれば左に、自分が敵の左にいれば右に移動しなきゃいけないことを踏まえておこう。これを言い換えれば、自分のXが敵のXより大きければ左に移動する、つまり-1をXに加える。逆に、自分のXが敵のより小さければ右に移動、つまり+1を加える、ってことになるよね。

n88_kaede.gif
はい、そうですねっ。

n88_reon.gif
では論より証拠。この図を見てねっ。

abdx1906-i01.JPG

n88_kaede.gif
おおーー。見事にSgnの値が、先輩の言っていた前提の通りになってますっ。これで、逃げるような動きにできたんですねっ。

n88_reon.gif
うん。ちなみに、式を逆にすると、敵が自分を追いかけるようになるよ。やってみてね。

n88_kaede.gif
はーいっ。

~完成っ~
n88_reon.gif
さて、最後は、自分が敵を捕まえたかどうかの判定だけど、これは簡単。敵のXとYが、自分のそれと同じになったかどうかをチェックすればOKだよ。

n88_kaede.gif
なるほどっ。それじゃ、さっそく入れてみましょうー。

n88_reon.gif
うん。だけどその前に、捕まえるのにどれだけの時間がかかったかをカウントする処理も入れちゃおう。
まず、プログラムの上の、Dim文がたくさん並んでいるところに、次の一行を追加して。

abdx1906-a02.JPG

abdx1906-p02.JPG
▲ 入れた後はこうなりました。

n88_reon.gif
それができたら、続いて、サブプロシージャGameProcの、さっき入れたdxWaitTimerのすぐ上に、次の一行を入れてね。

abdx1906-a03.JPG

abdx1906-p03.JPG
▲ 入れた後のGameProc

n88_reon.gif
やってることはいたって簡単。自分と敵の処理が終わるたびに、変数scに1を加算してるだけ。

n88_kaede.gif
ふむふむ。

n88_reon.gif
さて、ここまでできたら、いよいよ当たったかどうかの判定と、捕まえたときの処理だけだね。まず判定だけど、これはさっきも言った通り、自分のXとYが、敵のそれと同じかどうか調べるだけでOK。もし同じであれば、変数sceneに定数GAMEOVERを入れてゲームオーバーにうつす、と。
というわけだから、判定はこうなるよ。

abdx1906-a04.JPG

abdx1906-p04.JPG
▲ 入れた後のMoveMyCharaはこうなるよ


n88_reon.gif
そして最後に、ゲームオーバーの処理ね。まず、Dim文がたくさん並んでる最初のほうに、次のコードを書いてね。ここでは、ゲームオーバー画面用のハンドルを入れる変数を宣言してるよ。

abdx1906-a05.JPG

abdx1906-p05.JPG
▲ 入れた後

n88_reon.gif
さらに、サブプロシージャInitProcに、次のコードを書いてね。

abdx1906-a06.JPG

abdx1906-p06.JPG
▲ 入れた後のInitProcはこうなります

n88_kaede.gif
ゲームオーバーの画像を読み込み、ハンドルを、変数hndOverに格納してるんですね。

n88_reon.gif
うん、その通りだよ。さて、サブプロシージャOverProcの、Sub OverProc()とEnd Subの間に、次のコードを書いてね。

abdx1906-a07.JPG

abdx1906-p07.JPG
▲ 入れた後のOverProc

n88_reon.gif
ここでやってるのも簡単。ゲームオーバーの画面を出して、dxDrawFormatStringでかかった時間を表示させてるだけ。
これで完成だよ!

n88_kaede.gif
わーい、やったー!

n88_reon.gif
できたけど、ここで一つ課題を。今のプログラムでは、捕まえたらそのまま止まったままだけど、これを一定時間が過ぎたらタイトル画面にうつるようにしてみよう。それと、色々改良もしてみちゃおう!

n88_kaede.gif
はーい。頑張ります!

n88_reon.gif
それでは次回は、いよいよシューティングゲーム編にうつるよ。お楽しみに!



※次の更新は、『師匠TのチャレンジARSゲーム!』の予定です。お楽しみに!