1

私はクラス用のゲームを書いています。プレーヤーが行うことは、「wasd」を使用して追いかけているサメから離れて泳ぐことです。私の移動コードは

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    Select Case e.KeyCode

        Case Keys.W
            If picSwimmer.Location.Y > -5 Then
                Loc = New Point(picSwimmer.Location.X, picSwimmer.Location.Y - 15)
                picSwimmer.Location = Loc
            End If
        Case Keys.S
            End If
            If picSwimmer.Location.Y < Me.Height Then
                Loc = New Point(picSwimmer.Location.X, picSwimmer.Location.Y + 15)
                picSwimmer.Location = Loc
            End If

(私はa&dについても同じ設定をしています)。私の問題は、「wasd」キーの1つを押したままにすると、画像がわずかに移動してから停止し、約1秒後に滑らかに動き始めることです。これは、VBがキーが1回クリックされるのではなく、押されていることを認識するのにかかる時間の長さによるものだと思います。キーが最初から押されていることをVBが登録するようにするにはどうすればよいですか、またはキーが押されていることを認識するのにかかる時間を短縮するにはどうすればよいですか?または、キーを押すとすぐに動きがスムーズになるものはありますか?

4

3 に答える 3

2

必要なのはGetAsyncKeyState、すべてのキーを照会し、必要な機能をトリガーする、常に実行されているタイマーまたはスレッドです(1つの「ステップ」。キーが押されている限り、タイマーの間隔に合わせる必要があります)。これは、同時により多くのキーを処理できる唯一の方法でもあります(私は知っています)。
また、フォーカスとは無関係です(したがって、適切な要素にフォーカスがあるかどうかを確認する必要があります)。

基本:

Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Int32) As UShort
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    If GetAsyncKeyState(Convert.ToInt32(Keys.D)) Then Label1.Text = "RIGHT" Else Label1.Text = "-"
    If GetAsyncKeyState(Convert.ToInt32(Keys.W)) Then Label2.Text = "UP" Else Label2.Text = "-"
End Sub
于 2012-10-14T08:25:56.377 に答える
2

GetAsyncKeyStateもう一方のキーが押されている間に2番目のキーが押される可能性がある状況では、使用する方がはるかに優れています。

例えば:

プレーヤーは次のようになります。

  • 上キーを押したままにしてタンクを前方に移動します
  • スペースキーを押して発砲しています

イベントを使用した場合、プレイヤーがスペースキーKeydownを押すと戦車は動きを停止します。

再び動き始めるには、彼は矢を放し、発砲するたびに上キーをもう一度押す必要があります。

Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Int32) As UShort
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

If GetAsyncKeyState(Convert.ToInt32(Keys.Up)) Then
    ''put here codes for moving the tank
End If

If GetAsyncKeyState(Convert.ToInt32(Keys.Space)) Then
    ''PUT HERE CODES FOR TANK FIRE
End If

End Sub
于 2014-02-10T01:37:21.097 に答える
1

これはVisualBasicの設定ではなく、Windowsの設定であり、コンピュータ上のすべてのアプリケーションに影響Keybaord Propertiesするため、短くする必要があります。Repeat Delay Time

ここに画像の説明を入力してください

于 2012-10-14T02:08:13.983 に答える