初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

VisualBasic 2017 入門

35.メテオ5 爆発演出とゲームオーバー

 

今回は [ メテオ4 隕石の移動と当たり判定 ] の続きです。

ゲームでの演出はすべて自由です。
こうしなければならない、というものはありません。
1つルールがあるとするなら「プレイヤーが理解できるもの」だと思います。
しかし、演出に力を入れすぎてゲームの中身がない、なんてことにならないよう
バランスを考えて開発しましょう。

 

 

爆発演出を入れよう

自機と隕石が当たったら爆発する演出を入れます。
今回は1枚の爆発画像を使って、爆発しているように見せます。
あまり・・・
爆発しているように見えませんが、勘弁してください。

 

プログラムを次のように変更します。
g.DrawImage の部分は Timer1_Tick の中からコピーして、必要のない行を削除する感じで作業すると楽です。
新しく追加されているのは pExp.Image の表示だけです。

 

vb 爆発する演出

 

 

実行してみましょう。
自機の上で何度も爆発が表示されます。

 

vb 古臭い爆発の演出

 

 

爆発演出のしくみ

今回、少し悩んだのが「どこに処理を入れるか」でした。
ゲーム中の描画は Timer1_Tick で行っているのでこの中に入れてもよかったのですが、自機の操作や隕石の動きを止める処理を入れるとプログラムが複雑になります。

結局、爆発中の描画は別に行うようにしました。
こうすれば条件分の少ないシンプルなプログラムになるからです。

 

状況によって描画処理を分ける

 

 

プログラムの内容は次のようになっています。

 

vb 爆発演出のしくみ

 

変数 ecnt には、カウンタと拡縮のサイズという両方の役目をしてもらってます。
pExp.Image を表示するとき - ecnt / 2 しているのは、指定座標を中心点にするためです。
理解できないようであれば ( ex, ey, ecnt, ecnt ) というようにパラメータを変更して実行してみてください。
左上を中心として拡縮されるので、違和感があると思います。

初期処理 gameInit の中で ecnt = 40 している理由は
爆発の座標算出の条件文を実行させるためです。

 

 

ゲームオーバーを表示しよう

ゲームオーバーの表示をします。
ついでに「画面をクリックしてください」のメッセージも表示します。
次のようにプログラムを変更しましょう。

 

vb ゲームオーバーの表示

 

メッセージの点滅に Mod を使っています。
これは割った余りを算出する演算子です。

( msgcnt Mod 60 )
この式は変数 msgcnt の数がどんどん増えても、0から59 の間の数を出力します。

ゲームオーバー画像のサイズ指定を 350, 60 としています。
実際の画像より小さくしてます。
これで縮小表示されます。

 

 

実行してみましょう。
自機と隕石が当たってから 60 フレーム後(1秒後)にゲームオーバーが表示され、さらに 20 フレーム後から CLICK ON THE SCREEN の点滅が始まります。
msgcnt を使って表示タイミングを管理しているのです。

 

vb ゲームオーバーの表示

 

 

リトライのしくみを入れよう

ゲームオーバーの表示中に画面をクリックすれば、ゲームが再スタートするようにプログラムしましょう。

デザイン編集に戻り、何もないところをダブルクリックします。
(何もないのではなく、実際は pBase の上)

 

vb クリックでリトライのしくみ

 

pBase_Click が作成されます。
作成される場所は、上の画像とは違うかもしれません。

 

 

次のように pBase_Click の中にプログラムを追加しましょう。

 

vb リプレイのプログラム

 

画面をクリックすると、いつでも pBase_Click が呼び出されます。
それでは都合が悪いので、msgcnt が 80 以上ならゲームの初期化をするようにします。
80 以上になるのはゲームオーバー中にしかならないので、これで大丈夫です。
それから何故 80 なのかその理由は、自機が隕石と当たってから
CLICK ON THE SCREEN が表示されるまで 80 フレームとしているからです。

実行してみましょう。
そして、ゲーム中に画面をクリックして何も反応しないことと、
ゲームオーバー中にクリックしてリプレイできるかを確かめましょう。

 

ここで疑問を感じた人がいるかもしれません。
なんで、どこをクリックしても反応するんだろうと。
以前作成した「突破ゲーム」では、クリックした場所によっては反応しなかったことがありましたね。

それはクリックイベントを特定のコントロールにしか作らなかったのが理由でした。
今回も pBase しかクリックイベントを作ってません。
でも、画面上には pBase だけが表示されている状態なので、どこをクリックしても反応します。
表示されている絵は、すべて pBase 内に描かれたものなのだからです。