2014-07-12 5 views
0

작은 게임 애플릿을 만들고 있는데, 플레이어가 컨트롤을 가지고 돌아 다니는 곳으로가 보았습니다.Java keyPressed() 메소드는 플레이어가 탭을 누른 후에 만 ​​작동합니다.

주요 :

public class Main extends JApplet implements Runnable, KeyListener { 
    private static final long serialVersionUID = 1L; 
    private static DoubleBufferedCanvas canvas = new DoubleBufferedCanvas(); 
    public static int width = 900; 
    public static int height = 600; 
    public static int fps = 60; 

    public static Ailoid ailoid = new Ailoid(); 
    public static Player player = new Player(); 

    // Initialize 
    public void init() { 
     setSize(width, height); 
     setBackground(Color.white); 
     add(canvas); 
     addKeyListener(this); 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 

     ailoid.setLocation(new Location(100, 100)); 
     AlienManager.registerAlien(ailoid); 
     player.setLocation(new Location(400, 400)); 
    } 

    // Paint graphics 
    public void paint(Graphics g) { 
     super.paint(g); 
    } 

    // Thread start 
    @Override 
    public void start() { 
     Thread thread = new Thread(this); 
     thread.start(); 
    } 
    // Thread stop 
    @Override 
    public void destroy() { 

    } 

    // Thread run 
    @Override 
    public void run() { 
     Thread thread = new Thread(this); 
     while (thread != null) { 
      Updater.run(); 
      canvas.repaint(); 
      try { 
       // 1000 divided by fps to get frames per second 
       Thread.sleep(1000/fps); 
      } 
      catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void keyPressed(KeyEvent evt) { 
     KeyPress.run(evt); 
     System.out.println("DEBUG"); 
    } 

    @Override 
    public void keyReleased(KeyEvent evt) { 

    } 

    @Override 
    public void keyTyped(KeyEvent evt) { 

    } 
} 

무슨 일 그것은 단지 내가 탭을 누른 후 "디버그"라고 시작하는 것입니다. 플레이어가 탭을 누르지 않아도 어떻게 작동합니까?

+0

'KeyPress.run (evt);는 무엇입니까? – BitNinja

+0

1) 애플릿이 표시하는 JPanel의'paintComponent (Graphics g)'메소드를 그린다. 이것은 더블 버퍼링과 깜박 거림을 줄 것이다. 2) KeyListeners는 사용하지 말고, Swing 어플리케이션이므로 Key Binding을 사용하십시오. Key Binding은 포커스 할 때보다 유연합니다. –

답변

1

애플릿이 가장 가능성이 init 메소드에

this.requestFocus() 

를 추가 입력 focus.Try이 없습니다.

는 또한 JApplet에가 스윙 프레임 워크의 일부이며, 따라서 올바른 모든 것을 호출하지 않음으로써,이 주에서 발생했다 저도 같은 문제를했다 documentation

0
public static void main(String[] args) { 
    JFrame frame = new JFrame(GAME_TITLE); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(false); 
    sGame = new Game(GAME_WIDTH, GAME_HEIGHT); 
    frame.add(sGame);  
    frame.pack(); 
    frame.setVisible(true); 
    frame.setIconImage(Resources.iconimage);   
} 

에 언급 된 스레드 안전하지 있습니다 주문. sGame.add으로 전달하기 전에 원래 setVisible(true)을 가지고 있었고 frame.pack()이라고 불렀습니다.

이 코드는 저에게 효과적입니다.