set_alpha pos k_space event documentacion python function pygame milliseconds seconds

python - pos - Haz algo cada x(milli) segundos en pygame



python sleep milliseconds (2)

Estoy aprendiendo Python y Pygame, y lo primero que hago es un simple juego de Serpiente. Intento hacerlo para que la serpiente se mueva una vez cada 0,25 segundos. Aquí está la parte de mi código que se repite:

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 demás funciones se ejecuten normalmente, pero move_snake () solo se produce una vez cada 0,25 segundos. Lo busqué y encontré algunas respuestas, pero todas parecen demasiado complicadas para alguien que está haciendo su primer guión de Python.

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


Utiliza el módulo Reloj de Pygame para controlar el tiempo. Específicamente, el tick de método 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 ciclo 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


Hay varios enfoques, como el seguimiento de la hora del sistema o el uso de un Clock y ticks de conteo.

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

pygame.time.set_timer ()

repetidamente crea un evento en la cola del evento

set_timer(eventid, milliseconds) -> None

Establezca 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 haya transcurrido el tiempo.

Cada tipo de evento puede tener un temporizador separado conectado. Lo mejor es usar el valor entre pygame.USEREVENT y pygame.NUMEVENTS.

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

Aquí hay un pequeño ejemplo en el que 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()