Haz algo cada x (mili) segundos en pygame

Estoy aprendiendo Python y Pygame, y lo primero que hago es un juego Snake simple. Estoy tratando de hacer que la serpiente se mueva una vez cada 0.25 segundos. Aquí está la parte de mi código que hace un bucle:

while True: check_for_quit() clear_screen() draw_snake() draw_food() check_for_direction_change() move_snake() #How do I make it so that this loop runs at normal speed, but move_snake() only executes once every 0.25 seconds? pygame.display.update() 

Quiero que todas las otras funciones se ejecuten normalmente, pero move_snake () solo ocurre una vez cada 0.25 segundos. Lo busqué y encontré algunas respuestas, pero todas parecen ser demasiado complicadas para alguien que está creando su primer script en Python.

¿Sería posible obtener un ejemplo de cómo debería verse mi código en lugar de simplemente decirme qué función necesito usar? ¡Gracias!

Hay varios enfoques, como hacer un seguimiento de la hora del sistema o usar un Clock y contar los tics.

Pero la forma más sencilla es usar la cola de eventos y crear un evento cada x ms, usando pygame.time.set_timer() :

pygame.time.set_timer ()

crear repetidamente un evento en la cola de eventos

set_timer(eventid, milliseconds) -> None

Configure un tipo de evento para que aparezca en la cola de eventos cada número dado de milisegundos. El primer evento no aparecerá hasta que la cantidad de tiempo haya pasado.

Cada tipo de evento puede tener un temporizador separado adjunto. Es mejor usar el valor entre pygame.USEREVENT y pygame.NUMEVENTS.

Para deshabilitar el temporizador para un evento, establezca el argumento de milisegundos en 0.

Aquí hay un pequeño ejemplo de ejecución donde la serpiente se mueve cada 250 ms:

 import pygame pygame.init() screen = pygame.display.set_mode((300, 300)) player, dir, size = pygame.Rect(100,100,20,20), (0, 0), 20 MOVEEVENT, t, trail = pygame.USEREVENT+1, 250, [] pygame.time.set_timer(MOVEEVENT, t) while True: keys = pygame.key.get_pressed() if keys[pygame.K_w]: dir = 0, -1 if keys[pygame.K_a]: dir = -1, 0 if keys[pygame.K_s]: dir = 0, 1 if keys[pygame.K_d]: dir = 1, 0 if pygame.event.get(pygame.QUIT): break for e in pygame.event.get(): if e.type == MOVEEVENT: # is called every 't' milliseconds trail.append(player.inflate((-10, -10))) trail = trail[-5:] player.move_ip(*[v*size for v in dir]) screen.fill((0,120,0)) for t in trail: pygame.draw.rect(screen, (255,0,0), t) pygame.draw.rect(screen, (255,0,0), player) pygame.display.flip() 

introduzca la descripción de la imagen aquí

Usa el módulo Reloj de Pygame para mantener un registro del tiempo. Específicamente, el método tick de la clase Clock le informará el número de milisegundos desde la última vez que llamó a tick . Por lo tanto, puede llamar al tick una vez al principio (o al final) de cada iteración en su bucle de juego y almacenar su valor de retorno en una variable llamada dt . Luego usa dt para actualizar tus variables de estado del juego dependientes del tiempo.

 time_elapsed_since_last_action = 0 clock = pygame.time.Clock() while True: # game loop # the following method returns the time since its last call in milliseconds # it is good practice to store it in a variable called 'dt' dt = clock.tick() time_elapsed_since_last_action += dt # dt is measured in milliseconds, therefore 250 ms = 0.25 seconds if time_elapsed_since_last_action > 250: snake.action() # move the snake here time_elapsed_since_last_action = 0 # reset it to 0 so you can count again