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()