2014-10-08 2 views
0

VB.net 프로그래밍과 관련하여 문제가 있습니다. 특히 keydown 이벤트가 발생하면 개체를 이동하는 데 문제가 있습니다.개체를 주어진 공간에서만 움직이게하려면 어떻게해야합니까?

여기 상황이 있습니다. 나는 그림 상자를 패널 안에 넣고 그 그림 상자를 keydown에 따라 일정한 거리만큼 이동시켰다. 문제는 picturebox가 패널과 겹치는 것처럼 보입니다 (벽을 통과하는 것). 패널의 너비가 객체를 패널을 통과하지 못하도록 제한하는 코드와 관련이 있다고 생각합니다. 불행히도, 나는 그것이 일어나도록하기 위해 어떤 방법이나 그러한 방법을 찾아야 하는지를 알 수없는 것 같습니다.

여기 내 코드는 지금까지 있습니다 :

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 

답변

0

이 시도 :

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이 조건이 충족되는 경우 다음 가 '키를 비활성화 할 수있는 방법이 있나요? 끝 케이스 Keys.Right play_avatar.Left + = 100 주는 경우 play_avatar.Left = 200 다음 '이 조건이 충족되는 경우 키를 비활성화 할 수있는 방법이 있나요? 끝 부분 끝 선택 ' – Chris

+0

'조건이 충족 될 때까지 (play_avatar.Left)에 값을 지정하지 마십시오. 변수를 사용하여 100을 더하거나 뺀 후에 새 값을 먼저 테스트 한 다음이 값을 (play_avatar.Left)에 할당합니다. 키보드 처리 이벤트를 비활성화 할 수 없습니다. 조건이 충족되지 않는 경우에만 이벤트를 취소 할 수 있습니다. (Keys.Left. = Nothing) 대신 (e.Cancel = True)를 사용하십시오. – Ala

+0

@Lolo : 'Keys.Left'다음에 점을 찍었습니다. 간단히 'Keys.Left'여야합니다. 나는 여전히 여기에 약간의 결함이있는 것으로 의심한다. 왼쪽의 움직임을 패널의 오른편 가장자리와 비교하면, 그 반대의 경우도 마찬가지다. – Paul

관련 문제