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);
}
}
}
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. –
Édité, merci @JoeC –
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