关键是在vb.net中被压制?

时间:2012-10-14 01:54:05

标签: vb.net game-physics keydown

我正在为课堂写游戏,而玩家所做的就是使用“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

(对于&amp; d我也有相同的设置)。我的问题是当你按下其中一个“wasd”键时,图像会稍微移动然后停止,然后在大约一秒后开始流畅地移动。我认为这是由于VB识别按键被按下所需的时间,而不是被点击一次。我如何做到这一点,VB将注册密钥从一开始就被按下,或者缩短识别它被按下的事实所需的时间?或者任何一旦按下琴键就能使动作平稳的东西?

3 个答案:

答案 0 :(得分:1)

它不是Visual Basic设置,它是Keybaord Properties下的Windows设置,您需要缩短它Repeat Delay Time它将影响您计算机上的所有应用程序。

enter image description here

答案 1 :(得分:1)

你需要的是GetAsyncKeyState和一个不断运行的计时器或线程,它可以查询所有键并触发你需要的功能(一个“步骤”,你必须与计时器的间隔对齐,只要密钥被按下)。这也是我知道的唯一可以同时处理更多密钥的方法 并且它与焦点无关(所以也许你应该检查正确的元素是否有焦点)。

基础:

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

答案 2 :(得分:1)

在另一个按键被按下的情况下,使用GetAsyncKeyState会更好。

例如:

假设玩家是:

  • 按住向上键
  • ,向前移动水箱
  • 空格键
  • 射击

如果你使用了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