PyGame ne pas recevoir des événements lorsque 3+ touches sont enfoncées en même temps
-
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 ...
- Lorsqu'un événement
KEYDOWN
est gérée, elle fixe la variableKEYSTATE_*
correspondant à True. - 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?
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.
Autres conseils
Comme d'autres ont échappé à déjà, certains claviers (surtout moins cher, bas de gamme) ont une faible qualité
Certains claviers ne peuvent pas envoyer certaines touches ensemble. Souvent, cette limite est atteinte avec 3 clés.
Il peut très bien dépendre du clavier. Mon clavier actuel sans nom ne supporte que deux touches enfoncées en même temps, souvent une douleur dans les jeux.