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 :

Touches clavier simultanées


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Par défaut Touches clavier simultanées
    Bonjour,

    J'aimerais savoir si il existe une technique qui permet de détecter plusieurs touches enfoncées simultanément. Je m'explique : dans un petit jeu multijoueur, une partie du clavier (flêches directionnelles) est réservé au joueur 1 et les touches (Z,Q, S, D) sont réservées au joueur 2. Le problème est que si le joueur 1 laisse appuyer une touche, lorsque le joueur 2 appuye sur une touche, l'événement du joueur 1 s'arrête.
    Pour le déplacement à l'écran, j'utilise un KeyListener avec des booléens pour détecter les mouvements :

    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
    public void keyPressed(KeyEvent e) {
     
            if(e.getKeyCode() == this.keyUP)
                this.up = true;
            else
            {
                if(e.getKeyCode() == this.keyRIGHT)
                    this.right = true;
                else
                {
                    if(e.getKeyCode() == this.keyDOWN)
                        this.down = true;
                    else
                    {
                        if(e.getKeyCode() == this.keyLEFT)
                            this.left = true;
                        else
                        {
                            if(e.getKeyCode() == this.keyDROP)
                                this.drop = true;
                        }
                    }
                }
            }
     
            // Déplace la piece à l'écran en fonction du bouton pressé de la manette
            this.port.update();
        }
     
        public void keyReleased(KeyEvent e) {
     
            if(e.getKeyCode() == this.keyUP)
                this.up = false;
            else
            {
                if(e.getKeyCode() == this.keyRIGHT)
                    this.right = false;
                else
                {
                    if(e.getKeyCode() == this.keyDOWN)
                        this.down = false;
                    else
                    {
                        if(e.getKeyCode() == this.keyLEFT)
                            this.left = false;
                        else
                        {
                            if(e.getKeyCode() == this.keyDROP)
                                this.drop = false;
                        }
                    }
                }
            }
     
            this.port.update();
        }
    Merci,
    Bonne journée

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

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

    Le listener clavier est souvent inadapté au jeux vidéo, il a été conçu pour une utilisation plus traditionnelle. S'il existe un moyen de régler le problème, je ne le connais pas.
    La solution consiste à se tourner vers des librairies spécialisées, comme JInput par exemple. Ces librairies ne propose pas de listener mais des méthodes permettant de connaitre l'état du clavier à un instant t lors de l'exécution de ton appli, ce qui correspond parfaitement aux besoins d'un jeux vidéo.
    JInput permet aussi la gestion de manette de jeux.

  3. #3
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Citation Envoyé par Dimitri_87 Voir le message
    J'aimerais savoir si il existe une technique qui permet de détecter plusieurs touches enfoncées simultanément.
    Oui, il existe une technique qui permet de détecter plusieurs touches enfoncées "simultanément". Voici une petite démo:
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    /*
     * GameDemo.java
     */
     
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
     
    public class GameDemo extends JFrame {
     
        private GameDemo.GamePanel gamePanel;
     
        public GameDemo() {
            super("Arrows=red, Q,D,Z,S=black");
            setSize(400, 300);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            gamePanel = new GamePanel();
            add(gamePanel);
            new Thread(gamePanel).start();
        }
     
        public static void main(final String[] args) {
            new GameDemo().setVisible(true);
        }
     
        class GamePanel extends JPanel implements KeyListener, Runnable {
     
            private int x1,  y1,  x2,  y2 = 100;
            private boolean right1,  left1,  up1,  down1,  right2,  left2,  up2,  down2;
            private int speed1 = 5,  speed2 = 2;
     
            public GamePanel() {
                addKeyListener(this);
                setFocusable(true);
                requestFocusInWindow();
            }
     
            public void keyTyped(final KeyEvent e) {
            }
     
            public void keyPressed(final KeyEvent e) {
                setKey(e, true);
            }
     
            public void keyReleased(final KeyEvent e) {
                setKey(e, false);
            }
     
            private void setKey(final KeyEvent e, final boolean b) {
                if (e.getKeyCode() == KeyEvent.VK_Q) {
                    left1 = b;
                }
                if (e.getKeyCode() == KeyEvent.VK_D) {
                    right1 = b;
                }
                if (e.getKeyCode() == KeyEvent.VK_Z) {
                    up1 = b;
                }
                if (e.getKeyCode() == KeyEvent.VK_S) {
                    down1 = b;
                }
                if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                    left2 = b;
                }
                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    right2 = b;
                }
                if (e.getKeyCode() == KeyEvent.VK_UP) {
                    up2 = b;
                }
                if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                    down2 = b;
                }
     
            }
     
            public void run() {
                while (true) {
                    if (left1) {
                        x1 -= speed1;
                    }
                    if (right1) {
                        x1 += speed1;
                    }
                    if (up1) {
                        y1 -= speed1;
                    }
                    if (down1) {
                        y1 += speed1;
                    }
                    if (left2) {
                        x2 -= speed2;
                    }
                    if (right2) {
                        x2 += speed2;
                    }
                    if (up2) {
                        y2 -= speed2;
                    }
                    if (down2) {
                        y2 += speed2;
                    }
                    repaint();
     
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
     
            @Override
            protected void paintComponent(final Graphics g) {
                super.paintComponent(g);
                g.fillOval(x1, y1, 10, 10);
                g.setColor(Color.RED);
                g.fillOval(x2, y2, 10, 10);
            }
        }
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Par défaut
    Bonjour,

    Merci pour vos réponses. On était arrivé à un code a peu près similaire à celui là mais cela pose quand même problème à cause du Thread et du sleep. Si le thread est dans le sleep, et que l'on appuye rapidement sur une touche, elle n'est pas détectée. Idem si le sleep est plus long, les mouvements sont trop lent. De plus j'ai remarqué que lors d'appuis simultanés sur plusieurs touches, le keylistener ne reçoit pas de keyreleased pour une des touches.

Discussions similaires

  1. Event deux touches du clavier simultanément
    Par Orbiplanax dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 23/01/2008, 10h36
  2. [Win32] Récupérer un appui touche clavier
    Par elsargento dans le forum MFC
    Réponses: 19
    Dernier message: 06/05/2006, 11h05
  3. [JEditorPane]Captures des touches claviers
    Par splend_f dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 17/05/2004, 14h57
  4. [Applet]simuler une touche clavier
    Par mat10000 dans le forum Interfaces Graphiques en Java
    Réponses: 19
    Dernier message: 12/12/2003, 16h23
  5. envoie de touche clavier
    Par psfox2001 dans le forum DirectX
    Réponses: 1
    Dernier message: 13/03/2003, 21h56

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