Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gérer deux touches en même temps - Pygame

Sujet résolu
    23 décembre 2016 à 19:13:58

    Bonjour bonjour !

    Je sais que la question a été posée 10 000 fois, cependant je me confronte à un problème un peu différent des autres..

    Beaucoup de soulution proposent une méthode utilsant "key.get_pressed()". Cependant cela ne fonctionne pas chez moi..

    Comme simple test, j'ai réalisé ce petit bout de code :

    while 1:
    
    	k = py.key.get_pressed()
    	if k[K_t]: print("Yup!")

    Vous le devinerez.. ça ne fonctionne pas. Maintenant je souhaiterai savoir pourquoi, et surtout, comment résoudre ce problème ? ^^

    Merci d'avance :)

    -
    Edité par RhydanOtaku 23 décembre 2016 à 19:14:19

    • Partager sur Facebook
    • Partager sur Twitter

    Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter.

      24 décembre 2016 à 13:31:27

      Je mis connais pas beaucoup en Pygame, mais je pense que tu devrais mettre un and.
      • Partager sur Facebook
      • Partager sur Twitter
      ptit développeur en python principalement
        24 décembre 2016 à 15:21:27

        Salut,

        Ce bout de code fonctionne

        #!/usr/bin/env python3
        # -*- coding: utf-8 -*-
        
        import pygame
        from pygame.locals import *
        
        pygame.init()
        fenetre = pygame.display.set_mode((200, 200))
        clock = pygame.time.Clock()
        continuer = True
        
        while continuer:
            clock.tick(30)
            for event in pygame.event.get():
                if event.type == QUIT:
                    continuer = False
            k = pygame.key.get_pressed()
            if k[K_t]: 
                print("Yup!")
        

        Mais tu verras que si tu mets en commentaire la ligne clock.tick(30), ça prend une plombe pour voir les prints. Pourquoi ? Et bien parce que sans cette ligne, la boucle while tourne aussi vite qu'elle peut, prenant donc énormément des resources systèmes. Le temps que ton doigt enfonce la touche t, le programme a le temps de faire au moins 10 tours de boucles. Et pour chaque passage, il doit faire un print, qui prend aussi pas mal de temps machine. Cependant tout le temps est déjà accaparé par ta boucle while, et donc Python met un certain temps à t'afficher le print.

        Avec le timer, tu réduis la cadence de la boucle, et le CPU est plus à l'aise. Pour t'en convaincre, ouvre le gestionnaire de tâches et regarde l'utilisation du CPU avec et sans le timer.

        Dans tous les cas, si tu ne veux réagir qu'une fois à l'appui ou le relâchement de la touche, tu dois plutôt procéder avec la lecture des événements, comme ceci:

        #!/usr/bin/env python3
        # -*- coding: utf-8 -*-
        
        import pygame
        from pygame.locals import *
        
        pygame.init()
        fenetre = pygame.display.set_mode((200, 200))
        clock = pygame.time.Clock()
        
        continuer = True
        while continuer:
            clock.tick(30)
            for event in pygame.event.get():
                if event.type == QUIT:
                    continuer = False
                elif event.type == KEYUP and event.key == K_t:
                    print("Une seule fois quand la touche est relâchée.")
        

        Essaie de remplacer KEYUP par KEYDOWN pour voir la différence de comportement.

        Résumé : tu peux utiliser key.get_pressed() si lors du tour de boucle, tu es intéressé de savoir si la touche est toujours enfoncée. Tu utiliseras la méthode ci-dessus lorsque tu veux déclencher une action lors de l'appuie / relâchement d'une touche. Imagine qu'avec la touche P tu veux mettre le jeu en pause. La méthode get_pressed() serait désastreuse, car le jeu ferait des pause - resume trop rapidement pour le joueur.

        -
        Edité par Dan737 24 décembre 2016 à 15:31:37

        • Partager sur Facebook
        • Partager sur Twitter
          24 décembre 2016 à 16:39:49

          Bonjour à tous,

          Merci Dan737 :) En bidouillant un petit le code que tu m'a fourni, je me suis rendu compte qu'en fait le get_pressed() ne fonctionne que si l'on a un event.get() au dessus, source de mon problème ;)

          Quand à l'utilisation des touches, je connais bien leur différence d'utilisation, en l'occurence là c'est pour gérer un jeu deux joueurs avec des déplacements constants donc indispensable :)

          Merci beaucoup, bonne continuation !

          • Partager sur Facebook
          • Partager sur Twitter

          Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter.

          Gérer deux touches en même temps - Pygame

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown