¿Cómo esperar un tiempo en pygame?
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?
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()
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).
Si esperas un poco, puedes usar pygame.time.wait
o 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()