PyGame non riceve eventi quando vengono premuti più di 3 tasti contemporaneamente
-
05-09-2019 - |
Domanda
Sto sviluppando un gioco semplice in PyGame...Un razzo che vola in giro e spara cose.
Domanda: Perché pygame smette di emettere eventi di tastiera quando vengono premuti anche più tasti contemporaneamente?
Informazioni sulla gestione delle chiavi: Il programma ha una serie di variabili come KEYSTATE_FIRE, KEYSTATE_TURNLEFT
, eccetera...
- Quando un
KEYDOWN
viene gestito l'evento, imposta l'evento corrispondenteKEYSTATE_*
variabile su Vero. - Quando un
KEYUP
viene gestito l'evento, imposta la stessa variabile su False.
Il problema:Se UP-ARROW
E LEFT-ARROW
vengono premuti contemporaneamente, pygame NON emette a KEYDOWN
evento quando SPACE
viene premuto.Questo comportamento varia a seconda dei tasti.Quando si premono le lettere, sembra che riesco a trattenerne circa 5 prima che pygame smetta di emettere KEYDOWN
eventi per chiavi aggiuntive.
Verifica: Nel mio ciclo principale, ho semplicemente stampato ogni evento ricevuto per verificare il comportamento di cui sopra.
Il codice: Per riferimento, ecco il modo (grezzo) di gestire gli eventi chiave a questo punto:
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...
Per premere questa sequenza:
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)
Ecco l'output:
<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})>
E 'un problema comune?Esiste una soluzione alternativa?In caso contrario, qual è il modo migliore per gestire i problemi di controllo di più tasti quando si utilizza pygame?
Soluzione
Sembra un problema di input, non un problema di codice: sei sicuro che il problema non sia la tastiera stessa?La maggior parte delle tastiere presenta limitazioni sul numero di tasti che possono essere premuti contemporaneamente.Spesso non è possibile premere più di pochi tasti vicini alla volta.
Per provarlo, basta iniziare a tenere premute le lettere sulla tastiera e vedere quando le nuove lettere smettono di apparire.
Il mio suggerimento è di provare a mappare SPACE su una chiave diversa da qualche altra parte e vedere cosa succede.
Altri suggerimenti
Come altri hanno già eluso, alcune tastiere (soprattutto più economiche e di fascia bassa) hanno una bassa qualità matrice della tastiera.Con queste tastiere, alcune combinazioni di tasti porteranno al comportamento che stai riscontrando.Un altro effetto collaterale comune può essere rappresentato dai "tasti fantasma", in cui nel flusso di input verrà visualizzata la pressione di un tasto aggiuntivo che non è stato effettivamente premuto.
L'unica soluzione (se il problema è legato alla matrice della tastiera) è modificare la mappatura dei tasti per utilizzare i tasti su diverse righe/colonne della matrice o acquistare una tastiera con una matrice migliore.
Alcune tastiere non possono inviare insieme determinati tasti.Spesso questo limite viene raggiunto con 3 chiavi.
Potrebbe benissimo dipendere dalla tastiera.La mia attuale tastiera senza nome supporta solo due tasti premuti contemporaneamente, spesso una seccatura nei giochi.