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

avec Java Discussion :

Bug sur KeyReleased()


Sujet :

avec Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Par défaut [Résolu]Bug sur KeyReleased()
    Bonjour à tous,

    J'ai un problème qui commence à me taper sur le système...
    J'ai déjà posté, l'ai résolu avec l'aide de certains d'entre vous, et le bug est revenu.

    D'abord un peu de code :
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JFrame;
     
    public class Touches implements KeyListener {
    	// Variables
    	private JFrame frame;
    	boolean up, down, left, right;
     
    	// Constructeur
    	public Touches() {
    		frame = new JFrame();
    		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    		frame.setLocationRelativeTo(null);
    		frame.setSize(200,200 );
    		frame.addKeyListener( this );
    		frame.setVisible( true );
    		up = down = left = right = false; }
     
    	// KeyPressed()
    	public void keyPressed( KeyEvent e ) {
    		switch( e.getKeyCode() ) {
    			case KeyEvent.VK_UP:
    				if( ! up ) System.out.println( "up" );
    				up = true;
    				break;
    			case KeyEvent.VK_DOWN:
    				if( ! down ) System.out.println( "down" );
    				down = true;
    				break;
    			case KeyEvent.VK_LEFT:
    				if( ! left ) System.out.println( "left" );
    				left = true;
    				break;
    			case KeyEvent.VK_RIGHT:
    				if( ! right ) System.out.println( "right" );
    				right = true;
    				break;
    			default: }}
     
    	// KeyReleased()
    	public void keyReleased( KeyEvent e )
    	{
    		switch( e.getKeyCode() ) {
    			case KeyEvent.VK_UP:
    				System.out.println( "up released" );
    				up = false;
    				break;
    			case KeyEvent.VK_DOWN:
    				System.out.println( "down released" );
    				down = false;
    				break;
    			case KeyEvent.VK_LEFT:
    				System.out.println( "left released" );
    				left = false;
    				break;
    			case KeyEvent.VK_RIGHT:
    				System.out.println( "right released" );
    				right = false;
    				break;
    			default: }}
     
    	// KeyTyped()
    	public void keyTyped( KeyEvent e ) {}
     
    	// Méthode main()
    	public static void main( String[] arg ) {
    		new Touches(); }
     
    }
    Pour résumer, la classe ci dessus affiche dans la fenêtre de log d'Eclipse (mon IDE) les touches enfoncées et les touches relâchées
    J'appuie sur RIGHT et UP et je les maintiens enfoncées, j'ai les logs suivantes :
    right
    up


    Je relâche seulement UP, et voici les logs :
    up released
    right released


    RIGHT est toujours enfoncée.


    Au début, une désinstallation/reinstallation de ma JRE (1.6.0_14) a réglé le problème.
    Le lendemain, le bug est revenu.
    Depuis, j'ai désinstallé, réinstalle, testé toutes les versions des JRE 1.6 (a savoir l'update 11, 12, 13, 14), c'est pareil.

    J'ai formaté, tout réinstallé vendredi dernier : ça marche
    Ce matin, j'essaie, ça ne marche plus.
    Changement entre vendredi et aujourd'hui : install FlashPlayer + Firefox + forcément un redémarrage
    Aujourd'hui, j'ai de nouveau testé plusieurs versions de JRE, idem.

    Bref le problème vient du PC je pense, mais je vois vraiment pas d'où.
    Quelqu'un a t-il le même problème ? Une idée ?

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    Ce n'est pas un bug. C'est dû à l'auto-repeat. Les KeyListener ne sont pas fait pour ça, mais pour du texte ou des actions (une informatique de gestion lambda).
    Pour obtenir un résultat aux petits oignons, utilise plutôt une librairie portable de gestion des entrés (utilisé dans les jeux vidéo) comme JInput par exemple. Là, tu pourra maîtriser le tintouin.

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Par défaut
    Merci de ta réponse, je vais creuser cela.
    Mais cela n'est-il pas un peu lourd pour juste gérer un déplacement clavier ?

  4. #4
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    C'est un peu plus lourd effectivement, mais ce n'est pas non plus le pérou.
    Qu'est ce que tu appel un "déplacement clavier" ?

  5. #5
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Par défaut
    Par exemple déplacer un vaisseau dans un jeu type R-Type avec les flèches du clavier + 2-3 touches genre tirer, looping, ou changement d'arme.
    Enfin c'est le jeu/tuto sur lequel j'apprend en ce moment, et JInput m'a l'air bien compliqué pour mon niveau de connaissance (je débute).

    Ce qui est bizarre, c'est que ça a marché, et d'autres n'ont pas ce problème...

  6. #6
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Cela fait un moment que je cours après une gestion clavier avec KeyListener pour des jeux. Je n'ai jamais trouvé quelque chose de portable.
    Le comportement KeyListener semble différé un peu suivant les OS.
    Ce qui est bizarre, c'est que ça a marché, et d'autres n'ont pas ce problème...
    Si tu as une source qui le fait, je suis preneur.

    Il existe un super tuto en PDF sur JInput (en anglais) sur le net. Je n'ai plus l'adresse mais tu le trouvera avec google.

  7. #7
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Par défaut
    Bah la source qui le fait est celle que j'ai posté.

    En fait, ça marchait vendredi 26 au soir, je laisse passer le week end sans toucher au portable, je reviens lundi matin, je test, ça ne marche plus.

    Quand d'autres personnes compilent mon code, ça marche chez eux.
    C'est à n'y rien comprendre...

    J'ai trouvé déjà un pdf sur JInput, mai il parle de la gestion d'un gamepad, j'en suis pas encore là, je vais déjà essayer de comprendre le fonctionnement du clavier

  8. #8
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Quand d'autres personnes compilent mon code, ça marche chez eux.
    C'est à n'y rien comprendre...
    Le comportement KeyListener semble différé suivant les configurations systèmes.
    Ce ne semble pas adapté au jeu vidéo. Si tu veux diminuer l'auto-repeat, je pense que ce doit être possible avec un Thread (par exemple pour faire un changement d'arme qui ne défile pas à la vitesse de l'éclair lorsque l'on garde enfoncé la touche). Mais connaitre le moment de la touche pressé et le relâchement de cette touche sans l'auto-repeat, je n'ai jamais trouvé (en solution portable). Cela dit ça existe peut-être ! Si tu trouve je suis preneur.

    Avec JInput, tu peux gérer des manettes de jeu, le clavier ou/et la souris.
    Le principe est le même pour le clavier que pour les manettes en un peu + simple. En fait c'est assez simple, mais faut écrire un peu de code. La gestion du clavier est le plu simple.

  9. #9
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Par défaut
    Bon plus le choix alors, faut passer par JInput
    On m'a conseillé JAGaToo aussi, à étudier.

    Si tu as des ressources sur leur utilisation en français je suis preneur, je me débrouille avec l'anglais, mais c'est pas aussi facile qu'en français de comprendre de nouveaux concepts dans une langue étrangère (vu mon niveau en tout cas)

    Merci de ton aide

  10. #10
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Par défaut
    Je confirme que ton code compilé fonctionne chez moi.
    Petite remarque, il y a une limitation, si j'appuie sur 3 touches en même temps la 3ème peut ne pas marcher (et encore, ça dépend des touches utilisées, et de l'ordre...)

    Marrant.

  11. #11
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Citation Envoyé par Jyhem Voir le message
    On m'a conseillé JAGaToo.
    Connais pas. Je peux rien te dire. Si tu trouve des infos sur cette librairie n'hésite pas à ajouter un post c'est toujours interessant, elle est peut-être très bien cette librairie.
    Je connais seulement JInput, la seule que j'ai utilisé.

    Citation Envoyé par Jyhem Voir le message
    Si tu as des ressources sur leur utilisation en français je suis preneur
    J'en ai jamais vu, du moins qui soit vraiement interessante...

    Voila le tuto dont je t'avais parlé :
    http://www.edparrish.com/cis160/06s/...ts/GamePad.pdf
    une trentaine de page seulement.

  12. #12
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Par défaut
    Ha bah c'est le PDF que j'avais trouvé aussi et sur lequel je travaille.
    J'ai donc téléchargé l'API, glissé les dll/jar dans le dossier BIN de mon JDK, et lancé les tests qui me listent tous les périphériques connectés.

    Quand j'ai identifié mon clavier, j'ai testé l'appui sur plusieurs touches
    Et misère de misère, en testant JInput, c'est la mm chose...

    Appui sur la touche 1 du pavé num, le champ passe a ON
    Appui sur la touche 2 du pavé num, le champ passe a ON
    Je relache la touche 1 seulement, les 2 champs passent a OFF...


    Et effectivement, j'ai testé avec 3 touches, c'est encore plus bizarre
    Appui sur la touche 1 du pavé num, le champ passe a ON
    Appui sur la touche 2 du pavé num, le champ passe a ON
    Appui sur la touche 3 du pavé num, le champ passe a ON
    Je relache la touche 3 seulement, ou 2, ou 1, le champ correspondant passe a OFF
    Je relache n'importe laquelle des 2 touches restantes, les 2 champs restants passent a OFF

    Je craque
    C'est à vous dégouter, j'ai déjà formaté mon systeme...

  13. #13
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Par défaut
    Une question qui peut paraitre bête, mais t'aurais pas un second clavier sous la main pour tester ?

  14. #14
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Non, non. Ca te donne la même chose parce que c'est brut de pomme. Avec un simple boolean tu peux empêcher l'auto-repeat (au sein de ton appli). Sur et certain, je l'ai fait dans plusieurs jeux. Mais il faut écrire une classe qui le gère, soit pour toutes les touches, soit pour certaine touche seulement. Tu as donc le moyen de gérer certaine touche avec l'auto-repeat comme par exemple pour déplacer une raquette ou un vaisseau et d'autre sans auto-repeat comme par exemple un tir ou un changement d'arme. Tu as les deux possibilités.

  15. #15
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Par défaut
    Citation Envoyé par Kanithael Voir le message
    Une question qui peut paraitre bête, mais t'aurais pas un second clavier sous la main pour tester ?
    Bingo tu as mis le doigt dessus !!#*$#"!

    En fait pas tout à fait mais presque
    Mon portable est rélié à un switch qui me permet d'avoir un PC fixe et PC portable relié au même écran, au même clavier, et à la même souris.
    Quand je passe par le clavier du portable, ça fonctionne, quand je passe par le clavier USB relié au switch, ca bug, de même que l'appui sur 3 touches ne fonctionne pas du tout via la switch, mais très bien directement sur le portable.

    Ca mérite de plus amples tests, mais on dirait que le problème vient de là
    Merci à vous tous d'avoir pris le tps de m'aider !

Discussions similaires

  1. [RegEx] Petit Bug sur Expression Régulière
    Par Delphy113 dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 20h48
  2. [Plugin][VE]Bug sur Eclipse Visual Project Editor
    Par capitaine_choc dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 31/05/2005, 14h51
  3. Bug sur glColor3i !
    Par ZiZouJH dans le forum OpenGL
    Réponses: 23
    Dernier message: 04/06/2004, 10h21
  4. Bug sur la prorpiété required d'un TField avec ADO ???
    Par denrette dans le forum Bases de données
    Réponses: 6
    Dernier message: 04/11/2003, 11h04
  5. Page de rapport de bug sur le site de Sun
    Par piff dans le forum Général Java
    Réponses: 1
    Dernier message: 03/03/2003, 18h12

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