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
と書きました。
すみませんが、どなたかご存知の方がいらっしゃいましたら、ご教授ください。
お願いします。
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
修正ありがとうございます!
助かりました!!
Threadは、ゲーム作りに必須なようなので、勉強させていただきます!
良い機会もありがとうございました!
No.1
- 回答日時:
こんにちは。
流石にリアルタイム入力を処理するとなれば、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
ご回答ありがとうございます!
・・・スレッドは、まだ勉強していないので、未知の領域で、全然分かりません・・・
頑張って勉強します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Visual Basic(VBA) エクセル VBAについて 2 2022/05/16 16:33
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイクロソフトedge で5チャン...
-
スレッドの監視方法について
-
マルチスレッドのスレッド数を...
-
スレッドの安全な終了のさせ方
-
WaitForSingleObjectの使い方に...
-
LinuxでDoEvents()同等機能
-
MFC モーダルダイアログに動的...
-
一定時間ごとにメッセージを表...
-
スレッド内のCString使用
-
スレッドの終了はどうやるんで...
-
スレッドにて同一メモリの書き...
-
マルチコアを有効利用するプロ...
-
Windows上で、シグナル(SIGTERM...
-
Win32APIでのスレッド処理
-
プログラムを終わらせてください。
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
バックグラウンドのプロセスの...
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
Windows上で、シグナル(SIGTERM...
-
スレッドの終了の仕方
-
スレッドの安全な終了のさせ方
-
CWnd::OnTimerのスレッドの取得
-
MFC通信プログラムマルチスレッ...
-
Linuxでスレッド優先度って変え...
-
.netアプリへのSendMessageでフ...
-
VB2005 シリアル通信のClose処理
-
別スレッドからメインダイアロ...
-
マルチスレッドについて
-
スレッドの終了はどうやるんで...
-
マルチスレッドプログラミング...
-
別スレッドのデータを受信できない
-
特定のスレッドの破棄
-
msec単位のWait Timerが作れない!
-
C# スレッド終了の監視について
おすすめ情報