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.

l'animazione a 60 frame per secondo

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.

    1. import pygame
    2. pygame.init()
    3. screen = pygame.display.set_mode((400,300))
    4. palla = pygame.image.load('ball.png')
    5. pallaX=10
    6. pallaY=50
    7. direzione="destra"
    8. running = True
    9. framerate=pygame.time.Clock()
    10. while running:
    11. screen.fill((255, 255, 255))
    12. for event in pygame.event.get():
    13. if event.type == pygame.QUIT:
    14. running=False
    15. if direzione=="destra":
    16. pallaX+=10
    17. if pallaX>330: direzione="sinistra"
    18. if direzione=="sinistra":
    19. pallaX-=10
    20. if pallaX<10: direzione="destra"
    21. screen.blit(palla, (pallaX, pallaY))
    22. pygame.display.update()
    23. 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

    la visualizzazione dell'animazione a 30 frame per secondo

    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

    l'animazione a 60 frame per secondo

    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.

     


     

    Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

    FacebookTwitterLinkedinLinkedin
    knowledge base

    PyGame