Versión más rápida de 'pygame.event.get()'. ¿Por qué se pierden eventos y por qué se retrasan?

Resuelto S_Zizzle asked hace 4 años • 1 respuestas

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_inputfunció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 shootThrottlecomo 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!

S_Zizzle avatar Sep 25 '19 01:09 S_Zizzle
Aceptado

[...] 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)
Rabbid76 avatar Sep 24 '2019 19:09 Rabbid76