¿Cómo esperar un tiempo en pygame?

Resuelto bzrr asked hace 11 años • 3 respuestas

Si bien he estado usando time.wait en mi código desde que comencé a aprender Python y Pygame, me he estado preguntando si hay otras formas de hacerlo y cuáles son las ventajas y desventajas de cada enfoque. Por ejemplo, Pygame también tiene pygame.time.wait . ¿Cuál es la diferencia entre las funciones de espera de Python y las de pygame? ¿Cuál es mejor? ¿Y hay otras formas de esperar un tiempo además de utilizar estas dos funciones?

bzrr avatar Sep 17 '13 06:09 bzrr
Aceptado

Para animación/enfriamiento, etc.: si desea "esperar", pero aún tiene el código ejecutándose, use: pygame.time.get_ticks

class Unit():
    def __init__(self):
        self.last = pygame.time.get_ticks()
        self.cooldown = 300    

    def fire(self):
        # fire gun, only if cooldown has been 0.3 seconds since last
        now = pygame.time.get_ticks()
        if now - self.last >= self.cooldown:
            self.last = now
            spawn_bullet()
ninMonkey avatar Sep 17 '2013 17:09 ninMonkey

Para Python en general, querrás consultar la biblioteca de suspensión .

Para Pygame, sin embargo, el uso de pygame.time.delay() hará una pausa durante un número determinado de milisegundos según el reloj de la CPU para mayor precisión (a diferencia de pygame.time.wait).

ljs.dev avatar Sep 17 '2013 00:09 ljs.dev

Si esperas un poco, puedes usar pygame.time.waito pygame.time.delay. Sin embargo, si desea mostrar un mensaje y luego esperar un tiempo, deberá actualizar la pantalla de antemano. La pantalla se actualiza sólo si se llama a pygame.display.update()o . pygame.display.flip()Ver pygame.display.flip():

Esto actualizará el contenido de toda la pantalla.

Además, debe manejar los eventos con pygame.event.pump(), antes de que la actualización de la pantalla sea visible en la ventana. Ver pygame.event.pump():

Para cada cuadro de tu juego, deberás realizar algún tipo de llamada a la cola de eventos. Esto garantiza que su programa pueda interactuar internamente con el resto del sistema operativo.

Todo esto significa que tienes que llamar pygame.display.flip()y pygame.event.pump()antes pygame.time.delay()o pygame.time.wait():

screen.blit(text, (x, y))
pygame.display.flip()
pygame.event.pump()
pygame.time.delay(delay * 1000) # 1 second == 1000 milliseconds

Consulte también ¿Por qué PyGame no abre la ventana antes del retraso o del modo de suspensión?


En cualquier caso, esta no es la forma de esperar o retrasar algo en una aplicación típica. El juego no responde mientras esperas. Úselo pygame.time.get_ticks()para medir el tiempo.
Por ejemplo, si desea mostrar un mensaje en la pantalla, obtenga la hora actual y calcule el momento en el que el mensaje debe desaparecer. Muestra el mensaje siempre que la hora actual esté por debajo de la hora calculada:

message_end_time = 0
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # [...]

    current_time = pygame.time.get_ticks()
    if something_has_happened:
        message_surf = font.render('Important message!', True, (255, 0, 0))
        message_end_time = pygame.time.get_ticks() + 3000 # display for 3 seconds

    window.fill(0)

    # [...]

    if current_time < message_end_time:
        window.blit(message_surf, (x, y))
    pygame.display.flip()

Consulte también ¿Cómo puedo detener el disparo de más de una bala a la vez?


Ejemplo mínimo:PYGBAG demo repl.it/@Rabbid76/PyGame-MessageDelay

import pygame

pygame.init()
font = pygame.font.SysFont(None, 50)
text = font.render('press key or mouse', True, (255, 0, 0))

window = pygame.display.set_mode((500, 200))
clock = pygame.time.Clock()
message_end_time = pygame.time.get_ticks() + 3000

run = True
while run:
    clock.tick(60)
    current_time = pygame.time.get_ticks()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            text = font.render(pygame.key.name(event.key) + ' pressed', True, (255, 0, 0))
            message_end_time = pygame.time.get_ticks() + 2000
        if event.type == pygame.MOUSEBUTTONDOWN:
            text = font.render('button ' + str(event.button) + ' pressed', True, (255, 0, 0))
            message_end_time = pygame.time.get_ticks() + 2000

    window.fill(0)
    if current_time < message_end_time:
        window.blit(text, text.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()
Rabbid76 avatar Nov 05 '2020 16:11 Rabbid76