Visual Basic - 事件直到按键
Visual Basic - event until on keypress
首先,对于模糊的标题,我真的很抱歉。我很清楚堆栈溢出,我不知道如何表达这个问题。我想要的是按键(比如向上箭头)我想在 windows 窗体上移动一个图片框,直到它与一个单独的图片框碰撞。到目前为止,这是我的代码。
Private Async Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.Left
Me.pBox1.Left -= 20
Case Keys.Up
Me.pBox1.Top -= 20
Case Keys.Right
Me.pBox1.Left += 20
Case Keys.Down
Me.pBox1.Top += 20
End Select
这不是全部代码,只是重要的部分。基本上,在按键时,图片框会在窗体中移动。但是,我必须不断按住键才能让它移动。我想要的是按一个键,让图片框在屏幕上移动,直到碰到另一个图片框。
P.S。
我已经有了碰撞代码。
(pBox1.Bounds.IntersectsWith(pBox2.Bounds))
请记住,我非常了解 Visual Basic 和堆栈溢出。
您可以创建一个子程序,其中包含图片框的移动以及检测逻辑。从 Form1_keyDown() 内部调用它。
要记住的关键事项:
- 使用循环模拟点击移动指令
- 使用thread.sleep创建延迟效果
- 当图片框移动时,使用'inTheMiddleOfMoving'标志来确保按任何箭头键都没有效果(退出子程序)。
在点击 picturebox2 时退出循环,或者等待特定的时间跨度(这很重要)
Select Case e.KeyCode
Case Keys.Left
MovePictureBox(pbox1, pbox2, 20, KeyMovingDirection.Left)
...
Public Enum KeyMovingDirection
Left
Right
Top
Bottom
End Enum
Private inTheMiddleOfMoving As Boolean = False
Public Sub MovePictureBox(pbox1 As PictureBox, pbox2 As PictureBox, stepA
As Integer, direction As KeyMovingDirection)
If inTheMiddleOfMoving Then Exit Sub
Dim collided As Boolean = False
Dim t As New Stopwatch
t.Start()
Do
Select Case direction
Case KeyMovingDirection.Left
pbox1.Left -= stepA
Case KeyMovingDirection.Right
pbox1.Left += stepA
Case KeyMovingDirection.Top
pbox1.Top -= stepA
Case KeyMovingDirection.Bottom
pbox1.Top += stepA
End Select
inTheMiddleOfMoving = True
Threading.Thread.Sleep(200)
If pbox1.Bounds.IntersectsWith(pbox2.Bounds) OrElse t.ElapsedMilliseconds > 5000 Then
'...
collided = True
End If
Loop Until collided
t.Stop()
inTheMiddleOfMoving = False
End Sub
首先,对于模糊的标题,我真的很抱歉。我很清楚堆栈溢出,我不知道如何表达这个问题。我想要的是按键(比如向上箭头)我想在 windows 窗体上移动一个图片框,直到它与一个单独的图片框碰撞。到目前为止,这是我的代码。
Private Async Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.Left
Me.pBox1.Left -= 20
Case Keys.Up
Me.pBox1.Top -= 20
Case Keys.Right
Me.pBox1.Left += 20
Case Keys.Down
Me.pBox1.Top += 20
End Select
这不是全部代码,只是重要的部分。基本上,在按键时,图片框会在窗体中移动。但是,我必须不断按住键才能让它移动。我想要的是按一个键,让图片框在屏幕上移动,直到碰到另一个图片框。
P.S。 我已经有了碰撞代码。 (pBox1.Bounds.IntersectsWith(pBox2.Bounds)) 请记住,我非常了解 Visual Basic 和堆栈溢出。
您可以创建一个子程序,其中包含图片框的移动以及检测逻辑。从 Form1_keyDown() 内部调用它。 要记住的关键事项:
- 使用循环模拟点击移动指令
- 使用thread.sleep创建延迟效果
- 当图片框移动时,使用'inTheMiddleOfMoving'标志来确保按任何箭头键都没有效果(退出子程序)。
在点击 picturebox2 时退出循环,或者等待特定的时间跨度(这很重要)
Select Case e.KeyCode Case Keys.Left MovePictureBox(pbox1, pbox2, 20, KeyMovingDirection.Left) ... Public Enum KeyMovingDirection Left Right Top Bottom End Enum Private inTheMiddleOfMoving As Boolean = False Public Sub MovePictureBox(pbox1 As PictureBox, pbox2 As PictureBox, stepA As Integer, direction As KeyMovingDirection) If inTheMiddleOfMoving Then Exit Sub Dim collided As Boolean = False Dim t As New Stopwatch t.Start() Do Select Case direction Case KeyMovingDirection.Left pbox1.Left -= stepA Case KeyMovingDirection.Right pbox1.Left += stepA Case KeyMovingDirection.Top pbox1.Top -= stepA Case KeyMovingDirection.Bottom pbox1.Top += stepA End Select inTheMiddleOfMoving = True Threading.Thread.Sleep(200) If pbox1.Bounds.IntersectsWith(pbox2.Bounds) OrElse t.ElapsedMilliseconds > 5000 Then '... collided = True End If Loop Until collided t.Stop() inTheMiddleOfMoving = False End Sub