• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ボタンが押されたときの反応 Basic)

ボタンが押されたときの反応方法

このQ&Aのポイント
  • Active Basicでゲームプログラムを書いています。ボタンを押したときの反応で、上下左右に画像を動かしたいのですが、ボタンを押すと、いったん静止してから、連打処理(?)のように動きます。やりたいことは、ボタンを押すとすぐに上下左右に一定間隔で画像を動かすことです。
  • Sub MainWnd_KeyDown(KeyCode As Long, flags As Long)のコードを使用しています。
  • ボタンを押すとすぐに上下左右に一定間隔で画像を動かしたいです。どなたかご存知の方がいらっしゃいましたら、ご教授ください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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  

if-so-at
質問者

お礼

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

その他の回答 (1)

回答No.1

 こんにちは。  流石にリアルタイム入力を処理するとなれば、DirectInput(DirectX関連)などが無いと無理そうです。ですので、現状のコードでは実現不可能な雰囲気です・・・。  http://www.mb.ccnw.ne.jp/garger-studio/gameprog/top2.html  http://itpro.nikkeibp.co.jp/article/MAG/20061122/254532/  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  

if-so-at
質問者

お礼

ご回答ありがとうございます! ・・・スレッドは、まだ勉強していないので、未知の領域で、全然分かりません・・・ 頑張って勉強します。

関連するQ&A