Bonjour, Bonsoir
Je me suis lancé dans une implémentation du jeu "snake" en java (dans le but de découvrir ce langage plus concrètement). Je suis face à un problème concernant les événements clavier, problème que j'ai du mal à saisir ce qui complique mes recherches sur internet pour le résoudre.
J'ai donc créé une classe qui implémente les événements clavier (les flèches directionnelles) qui changent la direction de la tête du serpent.
Voici le problème :
Lors d'un lancement de l'application, je suis face à un tout ou rien :
- Soit je peux jouer normalement, c'est-à-dire faire bouger mon serpent comme bon me semble, la fenêtre réagit parfaitement au clavier.
- Soit le clavier n'intervient pas du tout dans la fenêtre (et le serpent va droit au mur)
C'est complètement aléatoire, après avoir fait plusieurs essais je dirai qu'il y a à peu près 40% de chance que ça marche (ce qui n'est pas bien évident pour jouer...)
Ci-dessous, je vous donne le code de la classe principale ainsi que celui du clavier. (J'ai mis quelques println dans le but de voir si tout s'enchainait correctement, je n'ai pas remarqué d'erreur de ce côté là. La gestion de la map, du serpent et de la partie n'est certainement pas du tout optimale et "propre", je me doute bien, mais comme je l'ai dit je débute)
Je vous remercie de prendre la peine de lire mon problème et de m'aider à le résoudre, j'espère avoir été clair dans mon explication... Je désespère depuis plusieurs jours !
Code de ma classe main :
Classe implémentant les touches du clavier
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class Test { public static void main(String[] args) { JFrame frame = new JFrame("SNAKE - By REEKER"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setSize(Constantes.FRAME_WIDTH, Constantes.FRAME_HEIGHT); frame.setLocationRelativeTo(null); frame.setResizable(false); Terrain t = new Terrain(); final Partie p = new Partie(t, 60); t.addKeyListener(new Clavier(p.map)); System.out.println("# KeyListener added***"); frame.setFocusable(false); p.map.setFocusable(true); System.out.println("# Map Focusable***"); frame.add(t); t.initmap(); p.map.maj(); try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} Thread thread = new Thread(new Runnable() { public void run() { System.out.println("[THREAD] -> Beginning..."); try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} System.out.println("[THREAD] -> Starting loop..."); while (true) { p.running(); try {Thread.sleep(p.getVit());} catch (InterruptedException e) {e.printStackTrace();} } } }); thread.start(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public class Clavier implements KeyListener { Terrain t; public Clavier(Terrain t) { this.t=t; } public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: this.t.snake.changeOrientation(Constantes.UP); System.out.println("----> UP"); break; case KeyEvent.VK_LEFT: this.t.snake.changeOrientation(Constantes.LEFT); System.out.println("----> LEFT"); break; case KeyEvent.VK_RIGHT: this.t.snake.changeOrientation(Constantes.RIGHT); System.out.println("----> RIGHT"); break; case KeyEvent.VK_DOWN: this.t.snake.changeOrientation(Constantes.DOWN); System.out.println("----> DOWN"); break; } t.repaint(); } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} }
Partager