Versión más rápida de 'pygame.event.get()'. ¿Por qué se pierden eventos y por qué se retrasan?
Estoy haciendo un clon de Asteroidz en pygame y tengo dos for event in pygame.event.get()
bucles, uno para verificar una solicitud de salida y si el juego debería haber comenzado presionando la barra espaciadora, luego más adelante en el juego para intentar limitar que el jugador mantenga presionada la barra espaciadora y dispare continuamente. . El código relevante para mi check_input
función, que se ejecuta una vez en cada bucle, se encuentra a continuación;
def check_input(self):
for event in pygame.event.get(): #NOT CHECKING THIS FAST ENOUGH, WHOLE PROCESS IS TOO SLOW
if (event.type == pygame.KEYUP) and (event.key == pygame.K_SPACE):
print ('boop')
self.shootThrottle = 0
if self.shootThrottle == 0:
self.shootThrottle += 1
bullets.add(Bullet(self.shape[0][0],self.shape[0][1], self.angle))
key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
self.angle -= 7
self.rotate(-7)
elif key[pygame.K_RIGHT]:
self.angle += 7
self.rotate(7)
if self.angle > 360:
self.angle -= 360
elif self.angle < 0:
self.angle += 360
if key[pygame.K_UP]:
self.accelerate()
elif key[pygame.K_DOWN]:
self.decelerate()
Lo estoy usando shootThrottle
como un medio para intentar evitar que se disparen balas hasta que se suelte la barra espaciadora. Este sistema funciona, pero al for event in pygame.event.get()
ser demasiado lento no funciona correctamente.
¡Cualquier ayuda es enormemente apreciada!
[...] y tener dos eventos for en
pygame.event.get()
bucles [..]"
Ese es el problema. pygame.event.get()
obtenga todos los mensajes y elimínelos de la cola. Ver la documentación:
Esto recibirá todos los mensajes y los eliminará de la cola. [...]
Si pygame.event.get()
se llama en varios bucles de eventos, solo un bucle recibe los eventos, pero nunca todos los bucles reciben todos los eventos. Como resultado, algunos eventos parecen pasarse por alto.
Obtenga los eventos una vez por cuadro y utilícelos en múltiples bucles o pase la lista de eventos a funciones y métodos donde se manejan:
def handle_events(events):
for event in events:
# [...]
while run:
event_list = pygame.event.get()
# [...]
# 1st event loop
for event in event_list:
# [...]
# [...]
# 2nd event loop
for event in event_list:
# [...]
# [...]
# function which handles events
handle_events(event_list)