2013-07-30 4 views
7

Ho letto domande simili a questo su Stack Overflow ma non hanno aiutato. Qui è il mio codice:pygame.key.get_pressed() non funziona

import pygame 
from pygame.locals import * 

pygame.init() 
screen = pygame.display.set_mode((640, 480)) 
pygame.display.set_caption('Hello World') 
pygame.mouse.set_visible(1) 

done = False 
clock = pygame.time.Clock() 

while not done: 
    clock.tick(60) 

    keyState = pygame.key.get_pressed() 

    if keyState[pygame.K_ESCAPE]: 
     print('\nGame Shuting Down!') 
     done = True 

Premendo escape non esce dal gioco o stampare un messaggio. è un insetto? Se stampo il valore per keyState [pygame.K_ESCAPE], è sempre zero.

risposta

12

Il problema è che non si elabora la coda degli eventi di pygame. Si dovrebbe semplice chiamata pygame.event.pump() alla fine del ciclo e quindi il codice funziona bene:

... 
while not done: 
    clock.tick(60) 

    keyState = pygame.key.get_pressed() 

    if keyState[pygame.K_ESCAPE]: 
     print('\nGame Shuting Down!') 
     done = True 
    pygame.event.pump() # process event queue 

Dal docs (sottolineatura mia):

pygame.event.pump()

gestori eventi internamente processo pygame

pump() -> None

Per ogni frame del gioco, è necessario effettuare una sorta di chiamata alla coda eventi. Ciò garantisce che il programma possa interagire internamente con il resto del sistema operativo. Se non si utilizzano altre funzioni evento nel gioco, è necessario chiamare pygame.event.pump() per consentire a pygame di gestire le azioni interne.

Questa funzione non è necessaria se il programma sta elaborando in modo coerente gli eventi in coda tramite le altre funzioni pygame.event.

Ci sono cose importanti che devono essere gestite internamente nella coda degli eventi. Potrebbe essere necessario riverniciare la finestra principale o rispondere al sistema. Se non si riesce a effettuare una chiamata alla coda eventi per troppo tempo, il sistema potrebbe decidere che il programma ha bloccato.

Si noti che non è necessario farlo se si chiama semplicemente pygame.event.get() in qualsiasi punto del ciclo principale; se non lo fai, dovresti probabilmente chiamare pygame.event.clear() così la coda degli eventi non si riempirà.

+0

In realtà potrebbe essere sufficiente chiamare 'pygame.event.poll()' che potrebbe essere leggermente più veloce. – martineau

1

Posso suggerire di utilizzare invece un evento que? E 'probabilmente una migliore idea:

while True: #game loop 
    for event in pygame.event.get(): #loop through all the current events, such as key presses. 
     if event.type == QUIT: 
      die() 

     elif event.type == KEYDOWN: 
      if event.key == K_ESCAPE: #it's better to have these as multiple statments in case you want to track more than one type of key press in the future. 
       pauseGame() 
+0

Stavo già usando questo metodo, ma non gestisce molto bene la pressione di un tasto simultaneo. – ZeroDivide

+0

È possibile impostare i valori booleani sulle variabili e renderli vere quando c'è un 'keydown' e li rendono nuovamente falsi quando c'è un' keyup'. Quindi basta controllare quale delle variabili è vera. Modificherò la mia risposta con un esempio in un secondo –

+1

@ZeroDivide che puoi combinare, utilizzando eventi e get_state a seconda di quali chiavi utilizzare quale. – ninMonkey

0

fare qualcosa di simile:

import pygame 
from pygame.locals import * 

pygame.init() 
screen = pygame.display.set_mode((640, 480)) 
pygame.display.set_caption('Hello World') 
pygame.mouse.set_visible(1) 

done = False 
clock = pygame.time.Clock() 

while not done: 
    clock.tick(60) 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 

    key = pygame.key.get_pressed() 

    if key[K_ESCAPE]: 
     print('\nGame Shuting Down!') 

    pygame.display.flip() 

non avete bisogno della pygame. sul se statment e inoltre si dovrebbe chiamare pygame.display.flip() in modo che mostra correttamente la finestra, allora avete bisogno di un Event Loop per uscire dal programma