2017-07-08 22 views
-1

私はJAVAのsnakeゲームに取り組んでいます。何らかの理由でKeyListenerが動作していないようです。私は答えを探すことを試みたが、私は助けて何も見つけることができなかった。私はJavaで初心者ですので、私が正しくキーストーンを使用しているかどうかはわかりません。私は何の出力も得られません。JAVA linux KeyListenerが動作していないようです

public class GameBoard extends JPanel implements Runnable, KeyListener{ 
    /** 
    * 
    */ 
    private boolean up, down, right, left; 

    private Thread thread; 
    private boolean running; 
    private long targetTime; 

    public GameBoard() { 
     setPreferredSize(new Dimension(WIDTH,HEIGHT)); 
     setFocusable(true); 
     requestFocus(); 
     addKeyListener(this); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     int k = e.getKeyCode(); 
     System.out.println("pressed"); 
     if(k == KeyEvent.VK_W || k == KeyEvent.VK_UP) up = true; 
     if(k == KeyEvent.VK_S || k == KeyEvent.VK_DOWN) down = true; 
     if(k == KeyEvent.VK_A || k == KeyEvent.VK_LEFT) left = true; 
     if(k == KeyEvent.VK_D || k == KeyEvent.VK_RIGHT) right = true; 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     int k = e.getKeyCode(); 
     System.out.println("Released"); 
     if(k == KeyEvent.VK_W || k == KeyEvent.VK_UP) up = false; 
     if(k == KeyEvent.VK_S || k == KeyEvent.VK_DOWN) down = false; 
     if(k == KeyEvent.VK_A || k == KeyEvent.VK_LEFT) left = false; 
     if(k == KeyEvent.VK_D || k == KeyEvent.VK_RIGHT) right = false; 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     int k = e.getKeyCode(); 
     System.out.println("typed"); 
    } 

    @Override 
    public void run() { 
     if(running) return; 
     init(); 
     while(running) { 
      startTime = System.nanoTime(); 

      update(); 
      requestRender(); 


      elapsed = System.nanoTime()-startTime; 
      wait = targetTime - elapsed/10000000; 
      if (wait > 0) { 
       try { 
        Thread.sleep(wait); 
       }catch(Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    private void init() { 
     addKeyListener(this); 
    } 


    private void update() { 

      if(up && dy == 0) { 
       dy = -SIZE; 
       dx = 0; 
      } 
      if(down && dy == 0) { 
       dy = SIZE; 
       dx = 0; 
      } 
      if(left && dx == 0) { 
       dx = -SIZE; 
       dy = 0; 
      } 
      if(right && dy == 0) { 
       dx = SIZE; 
       dy = 0; 
      } 

      if(dy!=0 || dx!= 0) { 
       for(int i = snake.size() -1 ;i > 0; i--) { 
        snake.get(i).setPosition(snake.get(i-1).getX(),snake.get(i-1).getY()); 
       } 
      } 
      head.move(dx,dy); 

      if(head.getX() < 0) head.setX(WIDTH); 
      if(head.getY() < 0) head.setY(HEIGHT); 
      if(head.getX() > WIDTH) head.setX(0); 
      if(head.getY() > HEIGHT) head.setY(0); 
    } 

    } 

} 
+0

ようこそスタックオーバーフロー!私はこのコードの95%があなたの問題に関連していないと思います。あなたの問題を示す[**最小**、完全で実証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 –

+0

編集、ありがとう@JoeC –

+0

@FredKで提案されているように、あなたは正しく 'JPanel'を呼び出すのではなく、ブロックスレッドを初期化しています。だから私はあなたがあなたのメインの方法を投稿した場合、私たちは問題を追跡するかもしれないと思います。 – AntJavaDev

答えて

-2

main()メソッドが表示されていないと、すべてがわかります。しかし、問題の1つは、run()メソッドがイベントスレッドをブロックする無限ループであることです。

+1

これは本当に質問に対する答えではありません。説明が必要な場合は、代わりにコメントとして投稿してください。 –

関連する問題