§9 シューティング・ゲーム(2)2 | プログラミング実習 |
【3】 ゲームの流れ
このゲームは終わらない。通常、このようなゲームでは、@制限時間中に打ち落とした敵機の数を競う、または、A決められた数の敵機をすべ打ち落とすのに要する時間を競うものとなっている。ここでは、@のプレイ時間に制限を設定する方法を採用する。
プログラムを起動してすぐに始まると不都合であるし、終了した後、もう一度できるような処理が必要である。大まかな流れは次のようになる。
@ ゲーム開始の確認をメッセージボックスで行う。
A ゲームを開始する。時間制限を設ける。
B ゲーム終了後、再度ゲームをするかどうかの確認をメッセージボックスで行う。
【4】 ゲーム開始の確認
操作 4 フォームのLoadイベントに対応するFome1_Loadメソッドにゲーム開始の確認をメッセージボックスで行うプログラム(下線部)を追加する。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles MyBase.Load
'UFOの初期位置
<<略>>
'MISILEの重なりを「最背面」に設定する。
picMISILE.SendToBack()
'ゲーム開始確認
MsgBox("ゲームを開始します。")
End Sub
実行すると開始確認のダイアログ(ウィンドウ)が表示される。[OK]をクリックするとゲーム用のウィンドウが表示されて開始する。
UFOがウィンドウの左端からスタートしない。原因は、確認のダイアログが表示されている間にUFOが移動を開始しているからである。
確認→ 追加した命令の前に「Me.Show()」を追加する。問題点の解消は次で行う。
Me.Show()は、フォームを表示するメソッドである。
プログラム起動と同時にタイマーが動作するため、開始確認中にもUFOが移動した。
操作 5 タイマー(Timer1)のプロパティを次のように変更する。
Enabled False
操作 6 フォームのLoadイベントに対応するFome1_Loadメソッドにタイマーを有効にするプログラム(下線部)を追加する。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles MyBase.Load
'UFOの初期位置
<<略>>
'ゲーム開始確認
Me.Show()
MsgBox("ゲームを開始します。")
Timer1.Enabled = True 'タイマー始動
End Sub
【5】 ゲーム時間の制限
ゲームのプレイ時間は30秒とする。ゲームの開始時間を記憶しておき、開始時間+30秒になったらゲームを終了させる(プレイ時間は後で変更する良い)。
○ 時間の取得
Microsoft.VisualBasic.DateAndTime.Timer プロパティ 時間はコンピュータの時間を利用する。Timerプロパティは、前回の午前0時から経過した秒数とミリ秒数の両方を返す。秒は戻り値の整数部分で、ミリ秒は小数部分である。
操作 7 ゲーム開始時間を記憶する変数StartTimeを実数(Double)型で宣言する(下線部)。この変数は、いろいろなメソッドで共通して使用できるようにグローバルで宣言する。
Public Class Form1
Dim StartTime As Double '開始時間
<<略>>
操作 8 フォームのLoadイベントに対応するFome1_Loadメソッドにゲーム開始時間を記憶するプログラム(下線部)を追加する。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles MyBase.Load
'UFOの初期位置
<<略>>
MsgBox("ゲームを開始します。")
Timer1.Enabled = True
'タイマー始動
StartTime = Microsoft.VisualBasic.DateAndTime.Timer '開始時間記憶
End Sub
開始時間を記憶させただけであるから、前と変わらない。プログラムが終了することはない。
【6】 ゲーム終了の確認
ゲーム中は、一定時間ごとにタイマー(Timer1_Tick)メソッドが実行されている。このメソッドで終了時間(StartTime+30)になったかどうかを判定する。
操作 9 タイマー(Timer1)のイベントに対応するメソッドに終了時間判定のプログラム(下線部)を次のように追加する。
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles Timer1.Tick
Dim tokuten As String, yesno As MsgBoxResult
'UFOの移動
<<略>>
'当たり判定
If picUFO.Top <= picMISILE.Top And …
<<略>>
End If
'終了確認
If StartTime + 30 < Microsoft.VisualBasic.DateAndTime.Timer Then
Timer1.Enabled = False 'タイマー停止
yesno = MsgBox("もう一度しますか。", MsgBoxStyle.YesNo)
If yesno = MsgBoxResult.Yes Then
'ゲーム再開(次に作成する)
Else
Me.Close() '終了
End If
End If
End Sub
ゲームを開始すると約30秒後にゲーム再開(終了)確認のダイアログが表示される。[いいえ(N)]をクリックするとプログラムが終了する。[はい(Y)]をクリックしても何も起こらないので、終了ボタンでプログラムを終わらせる。
※ 「アニメーション(2)」では、メッセージボックスでクリックされたボタンのデータを受け取る変数を整数(Integer)型で宣言した。ここでは、変数yesnoをMsgBoxResult型で宣言している。このようにすると、変数yesnoを記述したときにMsgBoxResult列挙体の候補リストが表示されるので便利である。
※ タイマー停止(Timer1.Enabled=False)をしないと終了確認のメッセージが複数表示され操作できなくなるので、注意が必要である。このようになった場合、実行の停止はVB開発環境で行う。
※ ゲーム再開の処理は次で作成する。
ゲームのプレイ時間のために、もう一つタイマーオブジェクトを追加して使っても良かったのだが、オブジェクトが増えるとプログラムサイズが増え、また、処理も重くなるので、コンピュータの時間を使う形にした。
§9 シューティング・ゲーム(2)2 | Copyright©2008 Hiroshi Masuda |