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

Programmation multimédia/Jeux Python Discussion :

Pygame : Comment gérer 2 touches différentes appuyer en même temps?


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur chimie et matériaux
    Inscrit en
    Septembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur chimie et matériaux
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Pygame : Comment gérer 2 touches différentes appuyer en même temps?
    Bonjour à toutes et à tous!

    Voilà voilà, je me suis mis à faire un jeu du pong amélioré en jeu de hockey que l'on trouve dans les lunaparks, ect... qui souffle de l'air pour surélever le puck, fin bref.

    En gros, j'ai une boule en haut qui se déplace avec les touches s, w, d, a et la boule en bas qui se déplace avec les touches K_DOWN, K_UP, K_RIGHT et K_LEFT.

    Ma question est : comment puis-je faire pour faire déplacer les 2 boules en même temps (en appuyant sur 2 touches différentes, genre w pour la boule 1 et K_UP pour la boule 2). J'ai essayé des trucs mais une des deux boules s'arrête.

    Voici ma partie gestion événements :

    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
     
    for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
     
                ##################################################
                ## Gestion des mouvements de la balle au-dessus ##
                ##################################################
                if event.key == K_DOWN:
                    #1 ère condition pour que la boule du haut reste dans son terrain
                    if math.fabs(HAUTEUR-CentreBalle1[1])-RayonB1>=0 and d > RAYON+RayonB1:
                            CentreBalle1[1]+=VitesseB1[1]            
                elif event.key == K_UP:
                    #2 ème condition pour que la boule du haut reste dans son terrain
                    if CentreBalle1[1]-RayonB1-HAUTEUR/2>5 and d > RAYON+RayonB1:
                                CentreBalle1[1]-=VitesseB1[1]
                elif event.key == K_RIGHT:
                    #3 ème condition pour que la boule du haut reste dans son terrain
                    if CentreBalle1[0]+RayonB1<=LARGEUR and d > RAYON+RayonB1:
                                CentreBalle1[0]+=VitesseB1[0]
                elif event.key == K_LEFT:
                    #4 ème condition pour que la boule du haut reste dans son terrain
                    if CentreBalle1[0]-RayonB1>5 and d > RAYON+RayonB1:
                                CentreBalle1[0]-=VitesseB1[0]
     
                ###################################################
                ## Gestion des mouvements de la balle en-dessous ##
                ###################################################            
                if event.key == K_s:
                    #1 ère condition pour que la boule du bas reste dans son terrain
                    if HAUTEUR/2-CentreBalle2[1]-RayonB2>=5 and d2 > RAYON+RayonB2:
                        CentreBalle2[1]+=VitesseB2[1]
                elif event.key == K_w:
                    #2 ème condition pour que la boule du bas reste dans son terrain
                    if CentreBalle2[1]-RayonB2>5 and d2 > RAYON+RayonB2:
                        CentreBalle2[1]-=VitesseB2[1]
                elif event.key == K_d:
                    #3 ème condition pour que la boule du bas reste dans son terrain
                    if CentreBalle2[0]+RayonB2<=LARGEUR-5 and d2 > RAYON+RayonB2:
                        CentreBalle2[0]+=VitesseB2[0]
                elif event.key == K_a:
                    #4 ème condition pour que la boule du bas reste dans son terrain
                    if CentreBalle2[0]-RayonB2>5 and d2 > RAYON+RayonB2:
                        CentreBalle2[0]-=VitesseB2[0]
    Voilà voilé, si quelqu'un avait une solution, voir une piste de solution, je lui en serais très reconnaissant.

    Follium

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Vous avez un exemple ici avec tkinter. Les claviers sont les mêmes quelque soit la bibliothèque, l'idée étant de détecter les KEYDOWN pour démarrer le déplacement et les KEYUP pour les arrêter.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Sans tkinter (cela serait dommage de rajouter tkinter, si vous utilisez que pygame), vous devez faire des if et non des elif dans votre code de reconnaissance des touches (si vous voulez avoir le déplacement Haut + Gauche ...). Mais pour votre gestion de deux entités, c'est théoriquement bon. Théoriquement, car il y a la notion de répétition de touche. Lorsqu'un utilisateur laisse la touche enfoncé, elle se répète. Cette répétition ne fonctionne que pour une touche (la dernière enfoncée), masquant ainsi toute autre touche enfoncée.
    Mais, heureusement, il y a une solution (solution que l'on voit moins souvent dans les tutoriels, sauf ici en C). La SDL (et donc pygame) propose une fonction pour récupérer un tableau contenant l'état de l'intégralité des touches du clavier (et cela est mis à jour à chaque pump_event). Cette fonction, c'est key.get_pressed(). Ainsi, plus de souci de répétition de touches et aucune touche ne sera masquée (sauf limite de votre clavier, mais ça, c'est autre chose).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par LittleWhite Voir le message
    Mais, heureusement, il y a une solution (solution que l'on voit moins souvent dans les tutoriels, sauf ici en C). La SDL (et donc pygame) propose une fonction pour récupérer un tableau contenant l'état de l'intégralité des touches du clavier (et cela est mis à jour à chaque pump_event). Cette fonction, c'est key.get_pressed(). Ainsi, plus de souci de répétition de touches et aucune touche ne sera masquée (sauf limite de votre clavier, mais ça, c'est autre chose).
    Vu ce qu'en dit la documentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     pygame.key.get_pressed()
        get the state of all keyboard buttons
        get_pressed() -> bools
    
        Returns a sequence of boolean values representing the state of every key on the keyboard. Use the key constant values to index the array. A True value means the that button is pressed.
    
        Getting the list of pushed buttons with this function is not the proper way to handle text entry from the user. You have no way to know the order of keys pressed, and rapidly pushed keys can be completely unnoticed between two calls to pygame.key.get_pressed(). There is also no way to translate these pushed keys into a fully translated character value. See the pygame.KEYDOWN events on the event queue for this functionality.
    on peut essayer mais, c'est pas "bullet proof".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    En effet, problématique pour les entrées texte. Mais ce n'est pas le cas courant dans un jeu vidéo.
    Aussi, pour les appuis rapides, si on fait un check toutes les 15 ms (60 FPS) alors faut vraiment que l'utilisateur soit rapide pour que l'appui soit invisible .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur chimie et matériaux
    Inscrit en
    Septembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur chimie et matériaux
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci merci, je regarde ce soir à toutes ces pistes.

    Follium

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur chimie et matériaux
    Inscrit en
    Septembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur chimie et matériaux
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    C'est bon, j'ai trouvé une solution.

    Au lieu d'y mettre ma condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if event.key == K_DOWN:
    J'y mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if pygame.key.get_pressed()[pygame.K_DOWN]:
    Et je remplace mes elif par des if.

    Merci bonsoir!

    Follium

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Pygame]Gérer deux touches appuyées en même temps
    Par yetimothee dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 19/11/2008, 20h13
  2. Evenement Onkey : comment gérer la touche control?
    Par Thi0123 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/03/2008, 13h37
  3. Réponses: 1
    Dernier message: 30/12/2006, 10h30
  4. Réponses: 3
    Dernier message: 30/06/2006, 14h39
  5. Comment gérer la touche echap ?
    Par Adrael dans le forum C
    Réponses: 28
    Dernier message: 11/07/2003, 13h15

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