2010-02-10 3 views
1

Java에서 작은 2D 게임 엔진을 개발 중입니다. 데비안 게임을 VirtualBox VM에서 우분투를 호스팅하고 놀고 난 후 이상한 버그가 발견되어 게임을 키가 눌러 졌다는 사실을 무시하십시오. 갑자기 움직이는 것을 멈출 때까지 왼쪽으로 달리고 있습니다.Linux/X11에서 Java keyPress/keyRelease 문제가 발생했습니다.

이제 실제 우분투에서 문제의 원인을 발견했습니다. key를 잡고 있으면 keyPress/keyRelease 이벤트가 항상 전송됩니다.

누르면 키를 확인하기 위해 내 시스템을

은 다음
- 핵심은 "downlist"에 추가를 누르면됩니다 경우
-의 각 프레임에 - 키를 해제하면 uplist
에 추가 게임이 downlist
에서 uplist에서 키를 제거 - 키가 두 번째 키를 누를 때 지금

을 누르면 년대 downlist 여전히있는 경우, 가끔 keyRelease는 여전히 다른 키에 의해 해고 마지막 이벤트였다 개최되었지만 그런 식으로 인정되지는 않는다.

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까? 정말 짜증나.
누르면 : 87
출시 : 87
출시 : 87
누르면 : 87
출시 : 87
대한 명확한

편집
이 계속 키를 누른 때 얻을 결과입니다 누름 : 87
발매 : 87
누름 : 87
발매 : 87

조금 더 나는이 X11 서버의 "기능"입니다,하지만 난 아직도 어떻게에서 "가짜"키 이벤트를 감지하는 단서가 없다는 것을 발견 인터넷 검색 확인 후

EDIT2
자바.

답변

1

좋아요 ... 나는 그것을 "고정"했습니다.

X11은 자동 반복 키 이벤트를 계속 발생시키기 때문에 "가짜"이벤트가 무시되는 방식으로 모든 것을 변경할 수있는 방법이 없으며 Java에서 "실제"이벤트와 "가짜"이벤트를 구별 할 수 없습니다 .

그래서 문제를 해결하는 방법은 다음과 같습니다. "진짜"keyUp 이벤트 이후

public final void keyPressed(final KeyEvent e) { 
    int key = e.getKeyCode(); 

    // Fix AutoKeyRepeat under X11 
    if (keysRemove.contains(key)) { 
     keysRemove.remove(Integer.valueOf(key)); 
    } 

    if (!keysDown.contains(key)) { 
     keysDown.add(key); 
     keysPressed.add(key); 
     lastKeys.add(key); 
     if (lastKeys.size() > 16) { 
      lastKeys.remove(0); 
     } 
    } 
    e.consume(); 
} 

: 모든 "가짜"keyUp 이벤트가 즉시 keyDown 이벤트 뒤에 있기 때문에이 다음처럼 보이는를 keyDown 이벤트를 수신 할 경우, 당신은 단순히 keyRemoveList에서 KeyUp 이벤트를 제거 즉시 처리되는 즉각적인 keyDown 이벤트가 뒤 따르지 않습니다. 이론적으로 게임 프레임이 "가짜"keyUp과 keyDown 사이에서 발생하는 것은 불가능합니다.

+0

예.하지만 현재의 실제 UP을 어떻게 감지합니까? Down이 빠른 시간 내에 등록 된 경우 배울 피 묻은 타이머가 필요합니다. 너무 못 생겼어. 리눅스는 나를 화나게한다. – Mordan

1

프레임마다 키를 누르거나 목록을 전환하는 방식으로 인해 충돌이 발생할 수 있습니다. 오른쪽 키, 왼쪽 화살표 키 등 누를 키 각각에 대해 부울 값을 갖는 것이 조금 더 깔끔합니다. 키를 누르면 해당 부울을 true로 설정하고 놓으면 false로 설정합니다. 이것은 비디오 게임에서 키보드 컨트롤을 다루는 꽤 일반적인 방법입니다.

+0

처음에는 그랬습니다. 그런 다음 키를 한 번 누르기 만했는지 확인해야했습니다. 따라서 키를 누른 상태로 있으면 한 번 트리거됩니다. 따라서이 코드를 처리 한 새 코드가 생겼습니다 (http://github.com/BonsaiDen/Bonsai- Game-Library/blob/master/src/org/bonsai/dev/GameInput.java), 이상한 GTK 동작을 제거 할 방법이 없다면 처음부터 전체 키보드 처리를 다시 작성해야 할 것입니다. 또한 게임에서 불필요한 keyReleased 이벤트 중 하나를 확인한 후에도 여전히 문제가있을 수 있습니다. –

+0

키 타이머를 프레임 타이머를 기반으로하지 않고 타이머에 넣는 것이 더 쉽습니다. – bkritzer

0

물론 자동 반복은 X11에서 구성 할 수 있습니다. xset 명령 옵션 r 또는 -r을 살펴보십시오. 일부 키 코드에 대해 자동 반복을 사용하지 않도록 설정할 수 있습니다.

$ xset -r keycode 
+0

글쎄,하지만 실제로 "이식성"이 아닙니다. 자바에서 게임을 사용하지 못하게 할 수 없으므로 게임을하고 경험 한 모든 사람들이이 문제를 스스로 해결해야합니다. –

+0

그것은 어리석은 기능입니다. 키 반복은 앱 도메인에 속해 있습니다. os는 하드웨어를 다룹니다. – Mordan

관련 문제