首先,我对模糊的标题感到非常抱歉。我很清楚堆栈溢出,我也不知道如何表达这个问题。我想要的是按键(例如向上箭头),我想在窗口窗体上移动图片框,直到它与单独的图片框碰撞。到目前为止,这是我的代码。
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和堆栈溢出非常了解。
答案 0 :(得分:1)
您可以创建一个子程序,其中包含图片框的移动以及检测逻辑。从Form1_keyDown()内部调用它。 要记住的关键事项:
在点击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