VB Wait関数

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に制御が移るようにしておきます。これで完成です。

最終更新:2005/03/22