§9 シューティング・ゲーム(2)3 | プログラミング実習 |
【7】 ゲーム再開の処理
ゲームを再開するには、Form1_Loadメソッドで行ったUFOやSHIPの初期位置の設定などを改めて行う必要がある。Form1_Loadメソッドを呼び出せば済むわけであるが、Form1_LoadメソッドはLoadイベントで呼び出されるメソッドであり、呼び出しとイベント発生が競合すると不都合が起こる。ここでは、ゲームの初期設定を行うメソッドを作成することにする。
操作 10 次のゲーム初期化メソッド(GameInit)を最後の行の「End Class」の直前に追加する。
プログラムは下線部を除いて、Form1_Loadメソッドのプログラムと同じである。
Private Sub GameInit() ←この行を入力すると最後の「End Sub」が自動的に入力される。
'UFOの初期位置
picUFO.Left = 0
picUFO.Top = 20
'SHIPの初期位置
picSHIP.Left = (Me.ClientSize.Width - picSHIP.Width)
/ 2
picSHIP.Top = Me.ClientSize.Height - picSHIP.Height
- 20
'BOMBとMISILEを非表示に設定する。
picBOMB.Visible = False
picMISILE.Visible = False
'MISILEの重なりを「最背面」に設定する。
picMISILE.SendToBack()
'得点の初期化
Label1.Text = "00000"
'ゲーム開始確認
Me.Show()
MsgBox("ゲームを開始します。" & Now.Second)
Timer1.Enabled = True 'タイマー始動
StartTime = Microsoft.VisualBasic.DateAndTime.Timer
'開始時間記憶
End Sub
※ Form1_Loadメソッドのプログラムに、得点の初期化だけ追加してある。
操作 11 フォームのLoadイベントに対応するFome1_Loadメソッドは、ゲーム初期化メソッドの呼び出しだけに変更する。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles MyBase.Load
GameInit() 'ゲーム初期化メソッド呼び出し
End Sub
操作 12 タイマー(Timer1)のイベントに対応するメソッドの終了確認の中にゲーム初期化メソッドの呼び出し(下線部)を追加する。
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles Timer1.Tick
<<略>>
'終了確認
If StartTime + JIKAN < Microsoft.VisualBasic.DateAndTime.Timer
Then
Timer1.Enabled = False
'タイマー停止
yesno = MsgBox("もう一度しますか。",
MsgBoxStyle.YesNo)
If yesno = MsgBoxResult.Yes Then
GameInit() '再開
Else
Me.Close()
'終了
End If
End If
End Sub
以上でシューティング・ゲームは一応完成である。
【メソッドの呼び出し】
ゲーム初期化のプログラムはForm_Loadメソッドに記述してあったので、ゲーム再開時にはForm_Loadメソッドを呼び出せば良く、わざわざ別(ここではGameInit)メソッドを作成しなくても良いのでは、とも考えられる。
Form_Loadメソッドは、イベントによって呼び出されるメソッドであるからイベント以外から呼び出さない方が良い。イベントはキーを押したりクリックしたりすると発生するので、プログラムからの呼び出しとイベントによる呼び出しが衝突する可能性も考えられる。衝突によって予想外の動作をするかもしれない。
このような理由から、実習のようなプログラムの構成にした。
すなわち、イベントによって呼び出されるメソッドはプログラムから呼び出さないようにする方が良い。
§9 シューティング・ゲーム(2)3 | Copyright©2008 Hiroshi Masuda |