我正在为课堂写游戏,而玩家所做的就是使用“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将注册密钥从一开始就被按下,或者缩短识别它被按下的事实所需的时间?或者任何一旦按下琴键就能使动作平稳的东西?
答案 0 :(得分:1)
它不是Visual Basic设置,它是Keybaord Properties
下的Windows设置,您需要缩短它Repeat Delay Time
它将影响您计算机上的所有应用程序。
答案 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