Visual Basic - Wait関数を作る
はじめに
ゲーム(ここではアクション等の「動きのある」ゲーム)をプログラムする際、ウェイトをかける処理が必要になってきます。その際、少し気を付けた方がいいことがあります。
Sleep関数
WinAPIで、Sleep関数というものがあります。これは、指定した秒数(ミリ秒)、処理を止めてくれる便利な関数です。
しかし、このSleep関数には少し問題があります。それは、Sleepしている間、Windowsに制御が移らないことです。例えば、10000ミリ秒Sleepしてしまうと、その間Windowsには制御が移らず、Windowsが「固まる」ような感じになってしまいます。
というわけで、無闇にSleep関数を使うのは少し問題がありそうです。ここでは、Windowsにちゃんと制御が移るような、新しいSleep関数を作ります。
timeGetTime関数を使ったWait関数
Wait関数を作るのに、ここではtimeGetTime関数を使います。これもAPIなので、プロシージャ外で宣言して下さい。
Declare Function timeGetTime Lib "winmm.dll" Alias "timeGetTime" () As Long
timeGetTime関数は、Windowsが起動してからの時間をミリ秒単位で返す関数です。例えば、Windowsが起動してから20分たっていたら、1200000が返されます。
これを利用して、時間がたつまでずっと同じ場所でループさせれば、Wait関数ができます。
DoEvents関数
そして、今回大切になるのがこのDoEvents関数です。これは、Windowsに制御を移してくれる関数です。これをループ内で使うことにより、プログラムが固まることがなくなります。
できあがったWait関数
先にできあがったWait関数を載せておきます。
Private Sub Wait(ByVal waittime As Long) Dim starttime As Long starttime = timeGetTime() Do While timeGetTime() - starttime < waittime DoEvents Loop End Sub
コードの説明です。
まず、初めにtimeGetTime関数を使い、時間を取得します。これをstarttimeという変数に格納しておきます。
それからは、ループが回るごとにtimeGetTimeを使い時間を取得し、そこからstarttimeを引き算します。このとき、引数のwaittimeより大きかったら、ループを抜け出して、ウェイト終了です。(つまり、waittimeの時間がたつまでループし続ける)
そして、このループでDoEvents関数を使い、Windowsに制御が移るようにしておきます。これで完成です。