|
分類:[VB.NET/VB2005 以降]
VB2005でシューティングゲームのような、リアルタイムで動くゲームを作成しようと考えています。
最初は無限ループを回して、「キー入力」「画像描画」「各種処理」を行おうと考えていましたが、
「キー入力」などの各種イベントを、をApplication.DoEvents で拾うのは良くない処理と思い、
無限ループは捨て、代わりにApplication.Idle イベントを利用しようと考えました。
そこで、試しに1秒ごとに「画像描画」を行うサンプルを作りましたが、
何もしなければApplication.Idleイベントも発生しないようで、結果、描画もされていきません。
(フォーム上でマウスを絶えず動かすなど何かすれば、Application.Idleは発生します)
Public Class Form1
Private mainGraphics As Graphics
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
If mainGraphics Is Nothing Then
Dim bmp As New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)
Me.BackgroundImage = bmp
mainGraphics = Graphics.FromImage(bmp)
End If
'MainLoop() ← こちらであればうまく動作しますが、DoEvents が気になる!
AddHandler Application.Idle, AddressOf Application_Idle
End Sub
Private targetTime As DateTime = DateTime.Now
Private Sub Application_Idle(ByVal sender As Object, ByVal e As EventArgs)
If DateTime.Now <= targetTime Then
Return
End If
DrawString() '//描画処理
targetTime = targetTime.AddMilliseconds(1000) '1秒
End Sub
Private Sub MainLoop()
While True
While DateTime.Now <= targetTime
System.Threading.Thread.Sleep(10)
Application.DoEvents()
End While
DrawString() '//描画処理
targetTime = targetTime.AddMilliseconds(1000) '1秒
End While
End Sub
Private stringValue As String = String.Empty
Private Sub DrawString()
stringValue &= "○"
mainGraphics.DrawString(stringValue, Me.Font, Brushes.Black, 0, 0)
Me.Invalidate()
End Sub
End Class
Application.Idleを利用して、タイマーの代わりとなるループ制御を行うには、
どのようにしたら良いでしょうか?
よろしくお願い致します。
|