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() 内部调用它。 要记住的关键事项:

  1. 使用循环模拟点击移动指令
  2. 使用thread.sleep创建延迟效果
  3. 当图片框移动时,使用'inTheMiddleOfMoving'标志来确保按任何箭头键都没有效果(退出子程序)。
  4. 在点击 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