나는 스네이크 게임을 만들려고 노력하고 있는데, 일반적인 구식 스쿨 게임이지만, 나는 키 바인딩을 사용하는 데 어려움을 겪고있다.루프 중에 키 바인딩을 처리 할 수 없습니까?
나는 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
}
왜 내 키 바인딩 루프 내부에서 작업하지 않지만, 외부 작업 않는 것이 그 것이다 그것?
스네이크를 처리하기 위해 하나는 스레드 응용 프로그램을 사용해야 할 수도 있습니다. 둘 다 동시에 플레이어 컨트롤을 처리하는 방법 –
이벤트 처리 코드는 while 루프와 동일한 스레드에 있으므로 분명히 할 수 있습니다. 루프에서 뭔가가 발생하면 애플리케이션에서 새 이벤트를 처리 할 수 없습니다. – lared
while 루프가 이벤트 스레드를 차단하고 있습니다. 이벤트 스레드는 큰 no-no입니다. 뱀을 움직일 별도의 실을 가지기보다는주기적인 타이머를 구독하고 그럴 때마다 뱀을 업데이트해야합니다. – jjm