PyGame ne pas recevoir des événements lorsque 3+ touches sont enfoncées en même temps

StackOverflow https://stackoverflow.com/questions/576634

  •  05-09-2019
  •  | 
  •  

Question

Je développe un jeu simple PyGame ... Un navire de fusée et voler autour trucs tir.


Question: Pourquoi ne pygame arrête d'émettre des événements de clavier lorsque les touches peuvent aussi sont pressées à la fois

A propos de la gestion des clés: Le programme a un certain nombre de variables telles que KEYSTATE_FIRE, KEYSTATE_TURNLEFT, etc ...

  1. Lorsqu'un événement KEYDOWN est gérée, elle fixe la variable KEYSTATE_* correspondant à True.
  2. Lorsqu'un événement KEYUP est géré, il fixe la même variable sur False.

Le problème: Si UP-ARROW et LEFT-ARROW sont pressées en même temps, pygame n'émet pas un événement KEYDOWN lorsque SPACE est pressé. Ce comportement varie en fonction des clés. Lorsque vous appuyez sur les lettres, il semble que je peux tenir environ 5 d'entre eux avant l'arrêt de pygame d'émettre des événements de KEYDOWN pour les clés supplémentaires.

Vérification:. Dans ma boucle principale, je simplement imprimé chaque événement reçu pour vérifier le comportement ci-dessus

Le code: Pour référence, voici le (brut) façon de gérer les événements clés à ce stade:

while GAME_RUNNING:
    FRAME_NUMBER += 1
    CLOCK.tick(FRAME_PER_SECOND)

    #----------------------------------------------------------------------
    # Check for events
    for event in pygame.event.get():
        print event

        if event.type == pygame.QUIT:
            raise SystemExit()

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_UP:
            KEYSTATE_FORWARD = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_UP:
            KEYSTATE_FORWARD = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_DOWN:
            KEYSTATE_BACKWARD = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_DOWN:
            KEYSTATE_BACKWARD = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_LEFT:
            KEYSTATE_TURNLEFT = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_LEFT:
            KEYSTATE_TURNLEFT = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_RIGHT:
            KEYSTATE_TURNRIGHT = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_RIGHT:
            KEYSTATE_TURNRIGHT = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_SPACE:
            KEYSTATE_FIRE = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_SPACE:
            KEYSTATE_FIRE = False

    # remainder of game loop here...

Pour appuyer cette séquence:

  • a (down)
  • s (down)
  • d (down)
  • f (down)
  • g (down)
  • h (down)
  • j (down)
  • k (down)
  • a (up)
  • s (up)
  • d (up)
  • f (up)
  • g (up)
  • h (up)
  • j (up)
  • k (up)

Voici la sortie:

  • <Event(2-KeyDown {'scancode': 30, 'key': 97, 'unicode': u'a', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 31, 'key': 115, 'unicode': u's', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 32, 'key': 100, 'unicode': u'd', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 33, 'key': 102, 'unicode': u'f', 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 30, 'key': 97, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 31, 'key': 115, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 32, 'key': 100, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 33, 'key': 102, 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 36, 'key': 106, 'unicode': u'j', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 37, 'key': 107, 'unicode': u'k', 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 36, 'key': 106, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 37, 'key': 107, 'mod': 0})>

Est-ce un problème commun? Y at-il un travail autour? Sinon, quelle est la meilleure façon de gérer les problèmes de contrôle multiples clés lors de l'utilisation pygame?

Était-ce utile?

La solution

Cela ressemble à un problème d'entrée, pas un problème de code - êtes-vous sûr que le problème n'est pas le clavier lui-même? La plupart des claviers ont des limites sur le nombre de touches qui peuvent être pressées en même temps. Souvent, vous ne pouvez pas appuyer plus de quelques touches qui sont proches les unes à la fois.

Pour le tester, il suffit de commencer maintenant enfoncée lettres sur le clavier et voir quand de nouvelles lettres n'apparaissent plus.

Ma suggestion est d'essayer la cartographie SPACE à une autre touche un autre endroit et voir ce qui se passe.

scroll top