Visual Basic-事件,直到按下按键

时间:2018-10-11 01:29:19

标签: vb.net collision keypress

首先,我对模糊的标题感到非常抱歉。我很清楚堆栈溢出,我也不知道如何表达这个问题。我想要的是按键(例如向上箭头),我想在窗口窗体上移动图片框,直到它与单独的图片框碰撞。到目前为止,这是我的代码。

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和堆栈溢出非常了解。

1 个答案:

答案 0 :(得分:1)

您可以创建一个子程序,其中包含图片框的移动以及检测逻辑。从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