2014-05-20 3 views
0

우분투를 사용합니다. 우분투가 키보드 입력을 처리하는 방식은 윈도우의 입력 방식과 다릅니다. 우분투에서 키 누름 이벤트가 트리거 된 후에 키를 놓은 경우에도 키 해제 이벤트가 바로 그 후에 트리거됩니다. 이러한 잘못된 키 릴리스 이벤트로 인해 특히 충돌 감지 프로그래밍과 같이 게임을 프로그래밍하기가 어려워졌습니다. 내 코드가 얼마나 완벽하든 문제를 해결할 수는 없습니다.리눅스에서 키보드 이벤트를 어떻게 처리합니까?

열쇠가 눌려 지거나 놓일지를 출력하는 프로그램을 작성한다면, 우분투의 출력은 다음과 같이 나타납니다 - keyPressed> keyReleased> keyPressed> keyReleased 등등 열쇠를 풀지 마라. 반면 창문에서 - 키 누름> 키 누름> 누름 누름> 누름 누름 등.

이 문제를 해결할 방법을 알고 있습니까?

import java.awt.Dimension; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Strange extends JPanel implements KeyListener{ 

    public Strange(){ 
     this.setPreferredSize(new Dimension(500, 500)); 

     addKeyListener(this); 
     setFocusable(true); 

     JFrame frame=new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(this); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode()==KeyEvent.VK_LEFT) 
      System.out.println("left is pressed"); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     if(e.getKeyCode()==KeyEvent.VK_LEFT) 
      System.out.println("left is released"); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) {} 

    public static void main(String[] args){ 
     new Strange(); 
    } 
} 
+0

어떤 언어를 사용하고 있습니까? 몇 가지 코드를 보여줄 수 있습니까? –

+0

나는 java를 사용합니다. 하지만 내가 게시 한 문제는 프로그래밍 언어에 의존하지 않고 낮은 수준의 문제입니다. – arandomguy

+0

@adnankamili 좋아요. 내 문제를 시연 할 수있는 코드를 게시했습니다. – arandomguy

답변

0

봅니다 이런 게임 루프와 업데이트 방법을 사용 :

public class Strange extends JPanel implements KeyListener{ 

public Strange(){ 
    this.setPreferredSize(new Dimension(500, 500)); 

    JFrame frame=new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(this); 
    frame.pack(); 
    frame.setVisible(true); 

    while(true){ 
     update(); 

     try{ 
      Thread.sleep(10); 
     }catch(Exception e){} 
    } 
} 

public void update(){ 
    addKeyListener(this); 
    setFocusable(true); 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    if(e.getKeyCode()==KeyEvent.VK_LEFT) 
     System.out.println("left is pressed"); 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    if(e.getKeyCode()==KeyEvent.VK_LEFT) 
     System.out.println("left is released"); 
} 

@Override 
public void keyTyped(KeyEvent e) {} 

public static void main(String[] args){ 
    new Strange(); 
} 
} 
-을 : 당신이 우분투에서이 작업을 실행하면 다음

, 내 문제가 명확하게하는 간단한 코드입니다

우분투가 아니기 때문에 잘 작동하는지 모르겠습니다. 그러나 나는 희망한다.

+0

글쎄, 내 질문에 전혀 관련이 없습니다. – arandomguy

관련 문제