プロが教える店舗&オフィスのセキュリティ対策術

Active Basicでゲームプログラムを書いています。

ボタンを押したときの反応で、上下左右に画像を動かしたいのですが、
ボタンを押すと、いったん静止してから、連打処理(?)のように動きます。
やりたいことは、ボタンを押すとすぐに上下左右に一定間隔で画像を動かすことです。

Sub MainWnd_KeyDown(KeyCode As Long, flags As Long)
If KeyCode=37 Then
If x<=3 Then
Exit Sub
End If
MyBmpInfo=2
x=x-5
Else If KeyCode=38 Then
If y<=0 Then
Exit Sub
End If
MyBmpInfo=1
y=y-5
Else If KeyCode=39 Then
If x>=600 Then
Exit Sub
End If
MyBmpInfo=3
x=x+5
Else If KeyCode=40 Then
If y>=400 Then
Exit Sub
End If
y=y+5
End If

InvalidateRect(hMainWnd,ByVal 0,TRUE)
End Sub

と書きました。

すみませんが、どなたかご存知の方がいらっしゃいましたら、ご教授ください。
お願いします。

A 回答 (2件)

 こんばんは。


 御礼頂き有難う御座います。
 先程、DirectInputとマルチスレッドがでないと無理と回答してしまったのですが(すんません)、標準タイマーとGetkeyboardState()を使用して、安易に実現出来ました。
 こんな感じです(SetTimerでタイムアウトを16ミリ秒に設定して確認しました)。

'標準のタイマー
Sub MainWnd_Timer(TimerID As DWord)

Dim key(256) As Byte

GetKeyboardState(key)

If key(VK_LEFT) And &h80 Then
If x<=3 Then
Exit Sub
End If
BmpInfo=2
x=x-5
End If

If key(VK_UP) And &h80 Then
If y<=0 Then
Exit Sub
End If
BmpInfo=1
y=y-5
End If

If key(VK_RIGHT) And &h80 Then
If x>=600 Then
Exit Sub
End If
BmpInfo=3
x=x+5
End If

if key(VK_DOWN) And &h80 Then
If y>=400 Then
Exit Sub
End If
y=y+5
End If

InvalidateRect(hMainWnd, ByVal 0, TRUE)

End Sub
 
    • good
    • 0
この回答へのお礼

修正ありがとうございます!
助かりました!!

Threadは、ゲーム作りに必須なようなので、勉強させていただきます!
良い機会もありがとうございました!

お礼日時:2009/01/20 17:38

 こんにちは。



 流石にリアルタイム入力を処理するとなれば、DirectInput(DirectX関連)などが無いと無理そうです。ですので、現状のコードでは実現不可能な雰囲気です・・・。

 http://www.mb.ccnw.ne.jp/garger-studio/gameprog/ …
 http://itpro.nikkeibp.co.jp/article/MAG/20061122 …

 GetAsyncKeyState()やGetKeyboardState()と言ったAPIも、先ずは役に立ちません。
 スレッドで定期的にDirectInputからキー入力を検出する事になりそうです。
 当然ながら排他アクセス等も入ってくる(と思う)ので、データの構造等も考えないといけません。
 大体こんな感じに成ると思います。

'構造体
Type ThreadData
hThread As HANDLE
dwThreadId As DWord
cSection As CRITICAL_SECTION
bLoop As Boolean
End Type

'スレッドで共有するデータは、其のまま書き込んだりするとデータが壊れます
'必ず、クリティカルセクションに挟み込んで排他アクセスをします
'グローバル
Dim tData As ThreadData

'ウィンドウ作成
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'
'ココら辺で前準備する
'
'クリティカルセクションを作成する
InitializeCriticalSection(tData.cSection)
tData.bLoop = True
'スレッドの始動
tData.hThread = CreateThread(0, 0, AddressOf(KeyCheck), 0, 0, tData.dwThreadId)
End Sub

'ウィンドウ破壊時
Sub MainWnd_Destroy()
'スレッドのループを止める
EnterCriticalSection(tData.cSection)
tData.bLoop = False
LeaveCriticalSection(tData.cSection)

WaitForSingleObject(tData.hThread, INFINITE)
'スレッドを消す
CloseHandle(tData.hThread)
'クリティカルセクションを消す
DeleteCriticalSection(tData.cSection)
End Sub

'排他してからフラグを取る
function IsLoop() As Boolean
EnterCriticalSection(tData.cSection)
IsLoop = tData.bLoop
LeaveCriticalSection(tData.cSection)
End Function

'キーチェックスレッド
function KeyCheck(lpParameter As VoidPtr) As DWord
Dim time As Long

While(IsLoop())

'ココでDirectInputからキー入力を受け取る

'取り敢えず時間でも数えておく
time = time + 1
SetWindowText(hMainWnd, Str$(time))

Sleep(16)
Wend

ExitThread(0)
KeyCheck = 0

End function

 
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

・・・スレッドは、まだ勉強していないので、未知の領域で、全然分かりません・・・
頑張って勉強します。

お礼日時:2009/01/16 20:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!