2015-01-02 7 views
-2

루프가 실행되는 동안 BMtron 게임을 생각하는 흔적을 남기고있는 연속 루프에서 사각형을 이동하려고하는데, keylistener로 사각형을 움직이면 화면이 정지되고 루프가 계속 실행 되더라도 객체는 움직이지 않습니다. 다음은 스 니펫입니다.화살표 키를 사용하여 루프에서 오브젝트를 이동하는 방법

public void keyPressed(KeyEvent e) { 
    //System.out.println("keyPressed"); 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     //moveRight(); 
     //down.start(); 
     U = false; 
     D = false; 
     L = false; 
     R = true; 
     while (R = true) { 
      x = x + 2; 
      repaint(); 
      System.out.println("Right"); 
     } 
    } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     R = false; 
     U = false; 
     D = false; 
     L = true; 
     while (L = true) { 
      //moveLeft(); 
      x = x - 2; 
      repaint(); 
      System.out.println("Left"); 
     } 
    } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     R = false; 
     U = false; 
     L = false; 
     D = true; 
     while (D = true) { 
      //moveDown(); 
      y = y + 2; 
      repaint(); 
      System.out.println("Down"); 
     } 
    } else if (e.getKeyCode() == KeyEvent.VK_UP) { 
     R = false; 
     D = false; 
     L = false; 
     U = true; 
     //System.out.println(""); 
     while (U = true) { 
      y = y - 2; 
      repaint(); 
      System.out.println("Up"); 
     } 
    } 
} 

전체 코드가 필요하면 알려주십시오.

+0

while 루프는 키 이벤트 핸들러 – bolov

+1

'동안 (R = TRUE)'이 루프 (및 기타)에 있으면 안 넌센스입니다. 우선 while (R == true) (또는 while (R))이어야하고 두 번째로는 루프 내에서 R의 값을 변경하지 않아야합니다. 그러면 루프가 어떻게 종료되어야합니까? 'R'은'거짓 '이 될 수 없다. – Tom

+0

내가 머리에 쓰던 방식이 그랬다. 화살표 키를 눌렀을 때 키 수신기 사용하기. 청취자는 해당 조치를 적용합니다. 전의. 오른쪽 화살표 키를 누르면 청취자는 다른 키를 누를 때까지 오브젝트를 오른쪽으로 무한대로 이동시킵니다. 그래서 물체가 오른쪽으로 움직인다면, 예를 들어 아래쪽 화살표 키를 누를 때까지 그렇게 할 것입니다. 그런 다음 R Boolean을 끄고 D 부울을 활성화합니다. 적어도 그것은 내가 머리 속에 가지고있는 것입니다. 나는 Java (프로그래밍)에 매우 익숙하지 않다. –

답변

3

Java에서 할당 표현식은 값을 반환합니다. 루프 참고 :

while(R = true) 
     ↑ 

비교할 필요가 있으며 지정하지 않아야합니다.

루프는 항상 while(true) (true이 할당 된 값입니다)을 쓰는 것처럼 실행되며 무한 루프를 실행하여 프로그램을 고정시킵니다. 그렇기 때문에 부울을 비교할 때 ==!=을 사용하지 않는 것이 좋습니다. 버그를 방지 할 수 있습니다. 대신에, 단지 쓰기 :

while(R) //same as while(R == true) but please don't use == 
+0

그가 그것을 바꾸면 어떻게되는지 궁금하다. 프로그램이 루프 중 하나에 고착되고 사용자가 다른 방향으로 다른 키를 누르면 청취자가이를 감지합니까? 아니면 여전히 루프에 "붙어 있기"때문에 프로그램에서이 이벤트를 놓칠 것입니까? 'ActionListener'가 별도의 스레드에서 메소드를 실행하는지 알면 좋을 것 같습니다 : D. – Tom

+1

@Tom 리스너가 구현되는 방식에 따라 다릅니다. 단지 익명 구현 일 경우 실제로 호출하는 동일한 스레드 내에서 실행됩니다. 예를 들어 [worker] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)를 사용하는 경우 다른 스레드에서 실행됩니다. – Maroun

+0

글쎄,이 문제를 해결하는 방법에 대한 제안이 있습니까? 나는 자바에 익숙하지 않아서 프로그램을 멈추지 않고 객체를 계속 움직일 수있는 방법을 모르겠습니다. –

관련 문제