Alcuni mesi fa ho trovato una serie di esempi sul pygame. Qui troverete la versione completa del articolo io postero solamente codice e una breve spiegazione tratta sempre dal articolo originale.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
imm_sfondo = "ciaomondo.jpg" import pygame from pygame.locals import* from sys import exit pygame.init() screen = pygame.display.set_mode((640,480), DOUBLEBUF | HWSURFACE, 32) pygame.display.set_caption("Ciao Mondo FPS!!!") sfondo = pygame.image.load(imm_sfondo).convert() x=0 speed=250 orologio = pygame.time.Clock() while True: for event in pygame.event.get(): if event.type == QUIT: exit() tempo_passato = orologio.tick(30) tempo_passato_sec = tempo_passato/1000.0 distanza_spostamento = tempo_passato_sec * speed if x>640: x=0 x+= distanza_spostamento screen.blit(sfondo,(x,0)) screen.blit(sfondo,(x-640,0)) pygame.display.flip() |
L’idea è quella di far scorrere la nostra immagine da sinistra verso destra, quindi l’unica cosa da controllare sono le coordinate delle ascisse e che l’immagine risulti continua nel movimento. Per far questo abbiamo dovuto aggiungere una variabile ‘x’ per tenere conto degli spostamenti e quindi l’abbiamo opportunatamente sostituita alle coordinate da aggiornare (al posto delle ascisse) per renderizzare l’immagine.
1 |
screen.blit(sfondo,(x,0)) |
Cambiando solo questo però, il risultato sarà che la nostra immagine si sposterà verso destra fino ad uscire dallo schermo. Per renderizzare la parte rientrante da sinistra, utilizziamo sempre screen.blit, ma con le coordinate partendo da – 640 pixel.
1 |
screen.blit(sfondo,(x-640,0)) |
Per rendere il tutto consecutivo, abbiamo bisogno che qualcuno riporti le ascisse allo stato iniziale una volta raggiunto il fine spostamento, per rendere ciclica la transizione, in questo modo:
1 2 |
if x>640: x=0 |
Con questi piccoli accorgimenti abbiamo la nostra immagine in movimento da sinistra verso destra, in un loop infinito, che si muoverà in base alla distanza_spostamento che sommiamo alla coordinata ‘x’.
Se fate girare questo programma senza gli altri accorgimenti che andremo ad introdurre tra poco, potrete facilmente notare che la velocità di esecuzione varia molto tra un pc e l’altro o anche sullo stesso pc in base alla disponibilità delle risorse di sistema.
Per rendere il tutto più omogeneo, abbiamo bisogno di due cose:
speed=250
1 |
orologio = pygame.time.Clock() |
Una velocità da noi preimpostata (speed=250) e un orologio che tenga conto del tempo passato. Fatto questo basta aggiungere :
1 2 3 |
tempo_passato = orologio.tick(30) tempo_passato_sec = tempo_passato/1000.0 distanza_spostamento = tempo_passato_sec * speed |
Tick è una funzione membro dell’oggetto Clock da noi creato. In questo caso, passandogli l’intero 30 gli diamo la direttiva di aggiornare lo schermo 30 fps. Il valore restituito da quella funzione però è in millisecondi, quindi o si procede con il calcolo in millesimi oppure convertite il tutto in secondi semplicemente dividendo per 1000. A questo punto basta aggiornare la distanza percorsa moltiplicando il tempo passato con la velocità da noi voluta, ovvero 250 pixel per secondo.
In questo modo l’immagine da voi prodotta si muoverà alla stessa velocità su qualsiasi pc, basta che riesca a renderizzare 30 fps.