IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

Ecouteur Clavier qui fonctionne aléatoirement


Sujet :

Interfaces Graphiques en Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Ecouteur Clavier qui fonctionne aléatoirement
    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 :
    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();	
    	}
    }
    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
    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) {}
    }

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 93
    Points
    93
    Par défaut
    La bonne méthode pour ce genre de choses est d'utiliser les classes InputMap et ActionMap. Aide-toi de ce lien et dis-nous si ça t'a suffi à régler ton problème.
    http://docs.oracle.com/javase/tutori...eybinding.html

Discussions similaires

  1. Jobs qui fonctionne sous Talend mais erreurs aléatoires une fois exporté
    Par stefb02 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 28/04/2015, 09h02
  2. touches clavier qui ne fonctionnent plus
    Par choumerv dans le forum Windows
    Réponses: 10
    Dernier message: 21/03/2014, 19h25
  3. Programme qui fonctionne aléatoirement
    Par HeadQuaker dans le forum Langage
    Réponses: 12
    Dernier message: 14/12/2012, 16h22
  4. Requête SQL qui fonctionne de manière aléatoire
    Par weberick dans le forum Bases de données
    Réponses: 13
    Dernier message: 18/11/2011, 12h00
  5. [C#] Hook Clavier qui ne fonctionne pas
    Par NeoKript dans le forum C#
    Réponses: 5
    Dernier message: 18/12/2009, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo