如何使对象仅在特定空间内移动?

问题描述:

我有一个关于VB.net编程的问题,特别是在keydown事件中移动对象时。如何使对象仅在特定空间内移动?

所以这里的情况。我在面板中放置了一个picturebox,并让这个picturebox在keydown上移动了一段距离。问题在于,图片框似乎与面板重叠(穿过墙壁)。 我在想,面板的宽度与限制对象通过面板的代码有关。不幸的是,我似乎无法找出做什么方法或我应该怎样做。

这里是我到目前为止的代码:

Private Sub EClassic_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 
    Select Case e.KeyCode 
     Case Keys.Left 
      play_avatar.Left -= 100 
      If play_avatar.Left = -200 Then 
       Keys.Left. = Nothing 
      End If 
     Case Keys.Right 
      play_avatar.Left += 100 
      If play_avatar.Left = 200 Then 
       Keys.Left. = Nothing 
      End If 
    End Select 
End Sub 

你的反应是非常感谢!谢谢。

编辑:

我觉得这工作得很好,感谢@Lolo。虽然我的编码看起来很便宜哈哈。

Dim c As Integer = Panel1.ClientSize.Width 
    Dim res As Integer 
    Dim res2 As Integer 
    res2 = c - c + 100 
    res = c/2 

    Select Case e.KeyCode 
     Case Keys.Left 
      If play_avatar.Left > res2 Then 
       play_avatar.Left -= 100 
      ElseIf play_avatar.Left < res2 Then 
       play_avatar.Left -= 0 
      End If 

     Case Keys.Right 
      If play_avatar.Left < res Then 
       play_avatar.Left += 100 
      ElseIf play_avatar.Left > res Then 
       play_avatar.Left -= 0 

      End If 

    End Select 

试试这个:

Private Sub EClassic_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown 
    Dim tmpLeft as integer 

    Select Case e.KeyCode 
    Case Keys.Left 
     tmpLeft =play_avatar.Left - 100 

     If tmpLeft < YourPanel.Left then 
     e.cancel=true 
     else 
     play_avatar.Left = tmpLeft 
     End If 

    Case Keys.Right 
     tmpLeft =play_avatar.Left + 100 

     If play_avatar.Right > YourPanel.Right then 
     e.cancel=true 
     else 
     play_avatar.Left = tmpLeft 
     End If 

    End Select 
End Sub 
+0

它似乎并没有为我工作。 我可能想知道这是否可能? '选择案例e.KeyCode 案例Keys.Left play_avatar.Left - = 100 如果play_avatar.Left = -200然后 “有没有什么方法来禁用一个关键,如果这一条件得到满足? End If Case Keys.Right play_avatar.Left + = 100 If play_avatar.Left = 200 Then Then '如果满足这个条件,有什么办法可以禁用键吗? End If End Select' – Chris 2014-10-08 08:32:56

+0

在您的条件满足之前不会为(play_avatar.Left)赋值。使用变量在添加/减去100后先测试新值,然后将该值赋给(play_avatar.Left)。您不能禁用键盘处理事件,如果您的条件不满足,您只能取消该事件。使用(e.Cancel = True)而不是(Keys.Left。= Nothing)。 – Ala 2014-10-08 08:44:04

+0

@Lolo:'Keys.Left.'后面有一个点 - 它应该只是'Keys.Left'。我仍然怀疑这里的逻辑有点缺陷,因为你将一个左边的动作与面板的右边缘进行比较,反之亦然...... – Paul 2014-10-08 10:59:43