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

AWT/Swing Java Discussion :

Problème pour faire bouger deux objets simultanement


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut Problème pour faire bouger deux objets simultanement
    Bonjour,
    Je suis entrain de réaliser un mini-jeu(pong-like), mes deux raquettes(correspondantes aux deux joueurs) bougent en fonction des boutons pressées au clavier, mais le problème est que on ne peut les faire bouger simultanément, c'est soit l'une soit l'autre.
    Je vous donne un aperçu de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void init()
      {
        addKeyListener(this);
      }
     public void keyReleased(KeyEvent e){}
     public void keyTyped(KeyEvent e) {}
    public void keyPressed(KeyEvent e)
      {
         /* ici je définie les actions en fonction des touches pressées
             pour la raquette player1 : ZQSD
             pour la raquette player1 : UP DOWN LEFT RIGHT
        */
      }
    Je voudrais savoir comment faire pour avoir deux Keylistener : un que gère les touches pressées par le player1, et lautre pour le player2.

    Est-ce-que je dois appeler une seconde fois addKeylistener?
    Mais dans ce cas comment attribuer un écouteur à un joueur, et l'autre écouteur à l'autre joueur.

    J'éspère avoir été à peu près clair, merci pour votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Ca c'est un problème intéressant !

    Le prob ce situe donc dans le fait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if(touche pressée = joueur){
    gérer joueur 1
    }else{
    gérer joueur 2
    }
    Tu peux peut être mettre un thread dans gérer joueur 1 et gérer joueur 2?

  3. #3
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Désolé mais je ne sais pas ce que c'est qu'un thread.

  4. #4
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Je me suis renseigné sur les threads, j'ai à peu près compris comment ça march(création, démarrage,...), mais je n'ai pas compris comment attribuer une tâche à un thread.

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par L Ankou
    Tu peux peut être mettre un thread dans gérer joueur 1 et gérer joueur 2?
    Cela ne changerait rien a priori, car les évènements sont générés à partir de l'edt, donc 1 seul thread!
    A priori, si les 2 appuient sur une touche en même temps, je pense que ça te génèrera 2 events, mais forcément de manière séquentielle (mais très rapidement)...

  6. #6
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Justement je voudrais savoir comment faire pour gerer deux evenement simultanés (ou presque) sachant que dans ma méthode keyPressed j'ai declaré un seul evenement KeyEvent e, et que par conséquent il n'y à qu'une raquette qui bouge à la fois.
    Je voudrais savoir comment faire pour avoir deux écouteur aux clavier ou deux evenments(si c'est possible) à la fois.

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par juve1897
    Justement je voudrais savoir comment faire pour gerer deux evenement simultanés (ou presque) sachant que dans ma méthode keyPressed j'ai declaré un seul evenement KeyEvent e, et que par conséquent il n'y à qu'une raquette qui bouge à la fois.
    Je voudrais savoir comment faire pour avoir deux écouteur aux clavier ou deux evenments(si c'est possible) à la fois.
    avec un if(la touche correspond au joueur 1) {...} else {...}
    ça devrait être ok...

    ça sera à la suite, mais à la vitesse où ils seront, tu ne devrais pas avoir de problème...

  8. #8
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    C'est à peu pres ce que je fais, le problème c'est que si par exemple le joueur 1 décide de monter(ou une autre action) le joueur 2 reste immobile pendant ce temps, les deux joueurs ne peuvent bouger simultanément.
    Je vais plutot te donner un aperçu du 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
     
    public void keyPressed(KeyEvent e)
      {
          if((player1.r.y+50)<(getHeight()))
    	    if(e.getKeyCode()==KeyEvent.VK_S)
    	      player1.r.y += 10;
     
    	if(player1.r.y>=0)  
    	  if(e.getKeyCode()==KeyEvent.VK_Z)
    	    player1.r.y -= 10;
     
    	if(player1.r.x-10>=0)
    	  if(e.getKeyCode()==KeyEvent.VK_Q)
    	    player1.r.x -= 10;
     
    	if((player1.r.x+5)<(getWidth()/2-10))
    	    if(e.getKeyCode()==KeyEvent.VK_D)
    	      player1.r.x += 10;
     
    	if((player2.r.y+50)<(getHeight()))
    	  if(e.getKeyCode()==KeyEvent.VK_DOWN)
    	    player2.r.y += 10;
     
    	if(player2.r.y>=0)  
    	  if(e.getKeyCode()==KeyEvent.VK_UP)
    	    player2.r.y -= 10;
     
    	if((player2.r.x-10)>=(getWidth()/2))
    	  if(e.getKeyCode()==KeyEvent.VK_LEFT)
    	    player2.r.x -= 10;
     
    	if(player2.r.x+5<=getWidth()-10)
    	    if(e.getKeyCode()==KeyEvent.VK_RIGHT)
    	      player2.r.x += 10;
      }
    Sachant que r est un champ de ma classe Raquette, et est un point qui represente le coin haut-gauche de la raquette.

  9. #9
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Le problème est que ce code se base sur la répétition des touches quand on laisse appuyé. Et je pari que l'OS ne répète qu'un caractère quand on maintient deux touches appuyées.

    La méthode usuelle pour les jeux est de se baser sur l'état des touches en jouant sur keyReleased et keyPressed. Soit en gérant leur état, soit avec quelque chose comme :

    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
     
    public void keyPressed(KeyEvent e)
      {
          if(e.getKeyCode()==player1.keyDown)
    	 player1.setDirection(Player.DirectionEnum.DOWN);
        [...]
       }
     
    public void keyReleased(KeyEvent e)
      {
          if(e.getKeyCode()==player1.keyDown
              && player1.direction==Player.DirectionEnum.DOWN)
    	 player1.setDirection(Player.DirectionEnum.NONE);
        [...]
       }
    Il faudra par ailleurs une boucle qui mette à jour à intervale régulier les positions des joueurs. Je pense qu'il faudra créer un thread pour ça, et donc synchroniser Player.setDirection, ou du moins déclarer Player.direction "volatile". Mais ça permettra de faire des déplacements plus petits plus souvant, d'où une meilleure animation.

  10. #10
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Citation Envoyé par Sivrît
    Il faudra par ailleurs une boucle qui mette à jour à intervale régulier les positions des joueurs. Je pense qu'il faudra créer un thread pour ça, et donc synchroniser Player.setDirection, ou du moins déclarer Player.direction "volatile". Mais ça permettra de faire des déplacements plus petits plus souvant, d'où une meilleure animation.
    Jusque là j'étais d'accord, mais là, c'est se faire du mal pour rien. Les javax.swing.Timers sont faits pour ça et simplifieront beaucoup la vie de juve1897.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  11. #11
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    J'utilise déjà un Timer, il me sert visualiser le mouvement des différents objet(balle,raquettes). Mais par contre je vois pas comment l'utiliser pour gérer le mouvement des raquettes independaemment.Moi je l'utilise de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Timer minuteur;
     
    public void start()
      {
        minuteur=new Timer(100,this);
        minuteur.start();
      }
    public void actionPerformed(ActionEvent evt) {repaint();}

  12. #12
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Tu peux utiliser un timer par joueur, mais ça ne sera pas plus simple que d'utiliser un Timer global. En gros, l'idée, c'est lors des keyPressed et KeyReleased, de changer l'état de la commande du joueur (de immobile vers haut, par exemple). Ensuite, le Timer vérifie à chaque exécution l'état de la commande des joueurs et les déplace en fonction.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  13. #13
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Le probleme c'est que ne sait pas ce que fait la méthode keyReleased, si tu pouvais m'expliquer en gros comment elle marche et à quoi elle sert je pourais peut etre resoudre mon probleme. Merci de ton aide.
    Sinon qu'est ce que tu pense de mon code, ou plus precisement de ma methode keyPressed et de mon Timer?

  14. #14
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Ben en gros keyPressed est appelée lorsqu'une touche est enfoncée, keyReleased lorsqu'une touche est relachée. La différence avec le code que tu as posté dans tes 2 avant-derniers messages, c'est que la raquette ne bouge pas dans keyPressed, elle bouge dans l'actionPerformed du Timer, suivant une direction qui elle est modifiée dans le keyPressed et le keyReleased.

    En rapide, ça ressemble à ça :
    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
    public void keyPressed(KeyEvent e) {
      if(e.getKeyCode() == KeyEvent.VK_UP)
        player1.yOrder += 1; // on enregistre l'ordre du joueur
      else if ...
    }
     
    public void keyReleased(KeyEvent e) {
      if(e.getKeyCode() == KeyEvent.VK_UP)
        player1.yOrder -= 1; // on oublie l'ordre du joueur
      else if ...
    }
     
    /** Methode exécutée par le timer */
    public void actionPerformed(ActionEvent e) {
      player1.raquette.y += player1.yOrder; // on applique l'ordre du joueur
     
      // on s'assure de ne pas sortir de l'écran
      if(player1.raquette.y > maxY)
        player1.raquette.y = maxY;
      else if(player1.raquette.y < minY)
        player1.raquette.y = minY;
     
      ... // faire la même chose en x et pour le joueur 2
     
      repaint();
    }
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/07/2005, 17h40
  2. problème pour faire des blocs
    Par tinkye_winkye dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 04/01/2005, 14h13
  3. [SQL] problème pour faire ma requete
    Par seb.briet dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/12/2004, 16h51
  4. [FLASH MX2004] Problème pour faire un bouton play
    Par melanie075 dans le forum Flash
    Réponses: 13
    Dernier message: 16/12/2004, 22h55
  5. [C#] Problème pour l'appel d'objet...
    Par AntiSAL dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/06/2004, 09h59

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