La funzione time.Clock() di pygame
La funzione time.Clock() di pygame definisce un oggetto di tipo clock per controllare la velocità di esecuzione dello script su computer diversi.
oggetto = pygame.time.Clock()
A cosa serve?
La frequenza di clock di un PC varia a seconda del processore e dell'hardware del computer. Quindi, in alcuni PC uno script python potrebbe girare molto più velocemente che in altri.
E questo potrebbe diventare un problema nel caso dei videogiochi.
Per evitare questo problema la libreria Pygame permette di fissare un framerate di gioco massimo, ossia una frequenza di aggiornamento delle immagini sullo schermo.
In questo modo lo script viene eseguito con la stesso frameset anche sui computer più veloci.
Cos'è il framerate? Il framerate per secondo è il numero di immagini visualizzate sullo schermo in un secondo. E' la frequenza dei fotogrammi. Spesso si indica con FPS.
Definisco un oggetto di tipo clock per controllare la velocità del gioco.
oggetto = pygame.time.Clock()
Poi imposto il framerate massimo tramite il metodo tick().
oggetto.tick(FPS)
Dove FPS è una costante numerica intera che indica il framerate massimo. Ad esempio 30.
E' lo stesso pygame a gestire la velocità di esecuzione dello script, inserendo delle pause di tempo durante i loop di gioco
Nota. Poiché la velocità di esecuzione varia nel tempo, devo invocare il metodo tick() in ogni iterazione del loop di gioco, dopo la funzione display.update(). L'oggetto clock, invece, lo definisco una sola volta nell'inizializzazione del gioco.
Ovviamente, se il PC che esegue il gioco ha prestazioni inferiori, il framerate del gioco è più basso.
Pertanto , il framerate va inteso come frequenza "massima" di aggiornamento.
Nota. Molti monitor hanno una frequenza di 60 Hz (hertz) ossia 60 frame al secondo. Quindi, creare animazioni oltre 60 FPS è inutile. In media un framerate pari a 60 è abbastanza buono per rendere fluide le animazioni. Laddove non è necessario posso usare anche framerate più bassi.
Un esempio pratico
Questo script visualizza il movimento di un oggetto sullo schermo.
- import pygame
- pygame.init()
- screen = pygame.display.set_mode((400,300))
- palla = pygame.image.load('ball.png')
- pallaX=10
- pallaY=50
- direzione="destra"
- running = True
- framerate=pygame.time.Clock()
- while running:
- screen.fill((255, 255, 255))
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running=False
- if direzione=="destra":
- pallaX+=10
- if pallaX>330: direzione="sinistra"
- if direzione=="sinistra":
- pallaX-=10
- if pallaX<10: direzione="destra"
- screen.blit(palla, (pallaX, pallaY))
- pygame.display.update()
- framerate.tick(30)
Nella riga 9 del codice definisco l'oggetto di tipo clock nella variabile framerate".
framerate=pygame.time.Clock()
Alla fine del loop di gioco, alla riga 23, uso il metodo tick() per fissare la velocità massima a 30 frame per secondo.
framerate.tick(60)
In questo modo se il gioco sta girando a framerate superiori, lo script rallenta automaticamente il passaggio da una iterazione a quella successiva del ciclo.
Ecco l'output dello script
Ad esempio, se alzassi il frameset massimo a 60 frame per secondo, l'animazione sarebbe molto più veloce.
framerate.tick(30)
Ecco l'output dopo la modifica
In un'animazione grafica la lentezza o i movimenti a scatti vanno evitati, ma anche l'eccesso di velocità non è detto che sia sempre il risultato ottimale.
E così via.