2017-07-08 8 views
-1

Je travaille sur le jeu de serpent JAVA et il semble que mon KeyListener ne fonctionne pas pour une raison quelconque. J'ai essayé de chercher des réponses mais je n'ai pas pu trouver quelque chose d'utile. Je suis débutant en Java, donc je ne sais pas si j'utilise le keylistener correctement. Je n'ai pas de sortie du tout.JAVA linux KeyListener ne semble pas fonctionner

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

Bienvenue dans Stack Overflow! J'imagine que 95% de ce code n'est pas pertinent pour votre problème. Veuillez créer un [** Exemple minimal **, complet et vérifiable] (http://stackoverflow.com/help/mcve) qui illustre votre problème. –

+0

Édité, merci @JoeC –

+0

Eh bien comme suggéré par @FredK, vous n'invoquez pas correctement 'JPanel' mais vous initialisez un thread bloquant. Donc, je suppose que si vous postez votre méthode principale, nous pourrions tracer le problème. – AntJavaDev

Répondre

-2

Sans montrer une méthode main(), tout ce que nous disons est juste une supposition. Mais un problème est que votre méthode run() est une boucle infinie qui bloque le thread d'événement.

+1

Ce n'est pas vraiment une réponse à la question. Si vous avez besoin d'une clarification, merci de poster un commentaire à la place. –