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...

  1. Quando un KEYDOWN viene gestito l'evento, imposta l'evento corrispondente KEYSTATE_* variabile su Vero.
  2. 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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top