# Java > Interfaces Graphiques en Java > AWT/Swing >  KeyListener pour un jeu en Swing

## vieks

Bonsoir,

Alors voil je suis en train de raliser un Bomberman en swing, tout fonctionne bien sauf pour une chose:

Le gameplay !

En effet, actuellement, le perso se dplace avec les touches directionnelles, ainsi je maintiens la touche enfonc et pas de problmes j'effectue le dplacement.

Mais, pour poser une bombe, j'utilise la touche espace !

Et l o c'est vraiment trs pnible, c'est lorsque j'appuie sur cette touche alors que j'avais une touche directionnelle enfonc en mme temps, je suis contrains de relcher ma touche directionnelle puis de la presser de nouveau pour pouvoir continuer mon dplacement.

En fait la pile d'vnements reste bloque pour la touche de dplacement tant que je ne la relche pas.

Pour rsumer: Si je me dplace dans une direction avec (VK_RIGHT ou VK_UP, etc...) en maintenant la touche enfonc et que en mme temps je pose une bombe avec VK_SPACE par exemple, les vnements de la touche directionnelle presse se stop.

Y a t-il une solution ou bien la gestion des events clavier en awt/swing est t'elle aussi limit, ce qui voudrait dire au final qu'il n'est pas possible de dvelopper un petit jeux 2d avec une gameplay un minimum potable en Java2D/Swing?

Merci pour votre aide, parce que l je dsespre  ::cry::

----------


## sinok

Comment procdes tu pour tes listener.

Une faon simple pour les directions de faire est de setter un flag lors du keyPressed et de le remettre  false lors du keyReleased. Et donc d'ignorer les vnements se passant entre les deux en fait.


Est-ce ce que tu fais?

----------


## Nico02

Voici un petit bout de code que j'ai ralilser, il utilise l'ide de sinok. 

Chaque touche est associ  un boolean. Tu mets ce boolen  vrai dans le keyPressed() et a faux dans le keyReleased(). Ensuite moi j'utilise une fonction externe (correspondant  un taux de rafrachissement) pour excuter toutes les actions pour lesquels le boolen est  vrai.



```

```

Ce code n'est pas complet et tu devras faire attention par exemple  la gestion de la concurrence (on ne peut pas aller  droite et  gauche en mme temps par exemple), mais il devrait t'aider  :;): 

Bon courage

----------


## Ivelios

Pour complter les prcdentes rponses : 


```

```

Ici, on regarde l'tat des touches toutes les secondes. Dans ton jeux, a sera toutes les 50ms ou un truc dans le genre.
Dans le code ci-dessus, il faut rajouter l'aspect concurrentiel entre droite/gauche et haut/bas. Et garder le choix du joueur en mmoire ( s'il appuie pendant 2ms et qu'il relche, tu n'auras pas le temps d'analyser son geste si tu regarde l'tat toutes les 50 ms ).

Bonne continuation

----------


## vieks

Bonjour, et merci  vous pour vos rponses  ::ccool:: 

Comme je le disais, lorsque j'effectue un dplacement, avec les touches directionnelles, donc en maintenant au moins une touche enfonc, le dplacement du personnage s'effectue. A ce moment l, si j'appuis sur la touche espace par exemple pour effectuer une action en mme temps que le dplacement (simultane),  les nouveaux vnements arrivant pour touche directionnelle press sont bloqu/plus dtect !

Donc je suis contraint de relcher la touche directionnelle puis de la presser de nouveau aprs avoir appuyer sur espace, afin de continuer le dplacement en cours !

Donc aucuns systmes de boolen ne fonctionne pour grer ce problme. Cela est t-il une limitation de la gestion des vnements de la plateforme java ???

Concernant le solution de Ivelios, de crer un Timer/Thread, c'est la solution auquel j'avais pens et je pense la seul qu'il me reste.

Mais le gestion des vnements par un thread n'est t-elle pas une implmentation un peu trop lourde ?

Effectivement, pour avoir un gameplay un minimum ractif, je vais pas attendre tout les 100ms (ce que demande dj pas mal de ressource processeur pour un seul thread) de grer l'action de l'utilisateur, car niveau ractivit c'est vraiment pas ce qu'il y a de mieux.

Si vous avez une autre ide pour rsoudre le problme parce que l vraiment je bloque.

----------


## sinok

Voici un exemple propre sur la faon de grer les inputs clavier:

http://zetcode.com/tutorials/javagam...movingsprites/

----------


## Nico02

> Donc je suis contraint de relcher la touche directionnelle puis de la presser de nouveau aprs avoir appuyer sur espace, afin de continuer le dplacement en cours !
> 
> Donc aucuns systmes de boolen ne fonctionne pour grer ce problme. Cela est t-il une limitation de la gestion des vnements de la plateforme java ???


a fonctionne trs bien, j'ai ralis plusieurs jeux avec ce systme  :;): 

A chaque intervalle de temps tu regardes quels boolens sont  vrai et tu fais les actions associs.

----------


## vieks

Merci  vous, donc effectivement pour grer correctement les events clavier en java, il faut utiliser un systme d'enregistrement des touches frappes, et obligatoirement un Thread/Timer Swing.

Il ne faut pas grer directement les actions utilisateurs depuis les mthodes KeyPressed, KeyReleased, etc... sinon le gameplay risque d'tre plus que limit: pas de gestion des touches en simultanes (combos de touches).

----------

