2015-01-05 3 views
0

나는 스네이크 게임을 만들려고 노력하고 있는데, 일반적인 구식 스쿨 게임이지만, 나는 키 바인딩을 사용하는 데 어려움을 겪고있다.루프 중에 키 바인딩을 처리 할 수 ​​없습니까?

나는 Gui 클래스의 인스턴스를 만든 후 JFrame, JPanel 및 JPanel 배열을 만듭니다. 이 인스턴스가 끝나면 while 루프를 사용하여 플레이어가 아직 살아 있는지 확인하고 플레이어가 있다면 난이도에 따라 1/4 초마다 뱀이 움직입니다.

while 루프가 아닌 경우 키 바인딩을 올바르게 사용할 수 있지만 내 프로그램에서 루프를 입력 할 때 내 버튼을 사용하여 나를 인식하지 못합니다.

어쩌면 이것은 내가 모르는 자바의 표준적인 것일 수 있습니다. 그렇다면 누군가 내 문제에 접근해야하는 방법을 보여줄 수 있습니까? 클래스와

InputMap im = base.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW); 
ActionMap am = base.getActionMap(); 

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "Right"); 
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left"); 
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Up"); 
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "Down"); 

am.put("Right", new ArrowAction("Right")); 
am.put("Left", new ArrowAction("Left")); 
am.put("Up", new ArrowAction("Up")); 
am.put("Down", new ArrowAction("Down")); 

:

public class ArrowAction extends AbstractAction { 
    String txt; 

    public ArrowAction(String txt) { 
     this.txt = txt; 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (txt.equalsIgnoreCase("Left")) { 
      System.out.println("The left arrow was pressed!"); 
      keyPressed = 0; 
     } else if (txt.equalsIgnoreCase("Right")) { 
      System.out.println("The right arrow was pressed!"); 
      keyPressed = 1; 
     } else if (txt.equalsIgnoreCase("Up")) { 
      System.out.println("The up arrow was pressed!"); 
      keyPressed = 2; 
     } else if (txt.equalsIgnoreCase("Down")) { 
      keyPressed = 3; 
      System.out.println("The down arrow was pressed!"); 
     } 
    } 
} 

단지 일반 while 루프 :

while (alive == true) { 
    // Some stuff happening, not relevant 
} 

왜 내 키 바인딩 루프 내부에서 작업하지 않지만, 외부 작업 않는 것이 그 것이다 그것?

+1

스네이크를 처리하기 위해 하나는 스레드 응용 프로그램을 사용해야 할 수도 있습니다. 둘 다 동시에 플레이어 컨트롤을 처리하는 방법 –

+2

이벤트 처리 코드는 while 루프와 동일한 스레드에 있으므로 분명히 할 수 있습니다. 루프에서 뭔가가 발생하면 애플리케이션에서 새 이벤트를 처리 할 수 ​​없습니다. – lared

+0

while 루프가 이벤트 스레드를 차단하고 있습니다. 이벤트 스레드는 큰 no-no입니다. 뱀을 움직일 별도의 실을 가지기보다는주기적인 타이머를 구독하고 그럴 때마다 뱀을 업데이트해야합니다. – jjm

답변

0

'general while loop'에 문제가 있습니다. 이것은 GUI 응용 프로그램이 작동하는 방식이 아닙니다. 모든 GUI 응용 프로그램 (Java Swing을 포함한)에서 프레임 워크는 루프를 실행하고 응답 할 이벤트를 보냅니다. 당신이 쓰는 모든 것은 사건에 응답해야합니다. 항상 실행해야하는 백그라운드 작업 인 경우 자체 스레드에 있어야합니다.하지만 게임에 필요하지는 않습니다.

그래서 일반적인 while 루프를 제거하고 자체 스레드 또는 '타이머'에 대한 응답으로 주기적으로 발생하는 '일부 항목'을 제거하십시오.