PyGame Sprite 3

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

Analisi

Come potete vedere alla linea 1, la classe creata estende pygame.sprite.Sprite, così da ereditare alcuni metodi e proprietà: per esempio possiamo utilizzare gruppi di sprite, per controllare meglio la renderizzazione (prossimamente vedremo anche questo) oppure per gestire meglio le collisioni. Dividerò l’analisi per ogni “funzione” che troveremo nella classe, per rendere più semplice la lettura.

Classe oggetto_esplosione : def __init__

Quando inizializziamo un nuovo oggetto abbiamo bisogno del nome, l’altezza e la larghezza della sprite che utilizzeremo, le coordinate della posizione iniziale (xy), l’oggetto screen (che rappresenza lo schermo dove si renderizza il tutto) e il numero di immagini che compongono la sprite (num).
Successivamente possiamo vedere che si richiama anche il metodo per inizializzare la sprite della libreria pygame (linea 3).
Procediamo caricando le immagini per la sprite, utilizzando la funzione vista in precedenza e settiamo l’immagine iniziale, che sarà il primo frame della lista di immagini ritornata.
Memorizziamo poi le coordinate dell’immagine, dividendo la tupla xy ed associamo un oggetto rect alla sprite, per gestire le collisioni. Per l’esempio in questione, ho spostato le cooridnate dell’oggetto rect per farle centrate rispetto l’immagine da me utilizzata, altrimenti la collisione inizierebbe appena si entra nel campo dell’immagine (anche se si utilizzano canali alpha), mentre qui ci interessa che la collisione con la bomba avvenga proprio nelle sue vicinanze. Inoltre in questo caso non necessitavo di spostare le varie bombe piazzate sullo schermo, ma se vi capita di fare un aggiustamento del genere dovete contarlo anche per eventuali spostamenti della sprite, perché l’oggetto rect deve rimanere incollato ad essa come un’ombra, altrimenti si perderà tutto il realismo che si è cercato di creare poco prima.
Non perdiamo traccia dello schermo (screen) e inizializziamo un variabile per l’esplosione (self.esplosione = False).
Memorizziamo poi il suono della nostra esplosione e il canale dove sarà riprodotto. Visto che tutte le esplosioni hanno assegnato lo stesso canale (il numero 4), sappiamo quindi che sarà solo utilizzato per la riproduzione delle bombe e non intaccherà gli altri effetti, come il sottofondo di pioggia e vento che metteremo.
Infine memorizziamo delle variabili che ci servono per le animazioni: maxframe per vedere se siamo arrivati alla fine, frame_corrente, temp_anim per il tempo di animazione e la variabile fine (necessaria per la fine del gioco, vedremo poi come).

Classe oggetto_esplosione : def update

Questa funzione necessita del tempo passato in secondi e di una stringa, che indicherà se l’esplosione deve avvenire o meno.
(Linea 24) Se l’esplosione è avvenuta (oppure non è mai iniziata) e la stringa passata è uguale a “None”, non dobbiamo far esplodere nulla; controlliamo però il volume dell’ambiente, perché in caso di esplosione conclusa, dobbiamo ripristinare i valori iniziali del volume, creando quindi un effetto di vuoto tra il tempo dell’esplosione e la sua conclusione (perchè più avanti abbasseremo il volume dell’ambiente se l’esplosione è avvenuta). Se il volume non è tornato ancora alla normalità si incrementa solamente il tempo di animazione. Il tutto ci serve per regolare la durata dell’effetto e se il volume di ambiente (che va di pari passo con quello del vento, per questo non controlliamo entrambi) è nella norma si esce subito, quindi non avviene nessuna esplosione e non si vedrà nulla (a meno che la stringa non indichi diversamente).
Dalla linea 31 vediamo invece che cosa accade se l’esplosione deve sussistere. Esplosione diventa vera grazie al primo controllo, controlliamo comunque che sia vera, perché significa che stiamo in animazione. Subito dopo, se siamo nel tempo di animazione giusto (per il mio esempio ho scelto che ogni frame deve essere visualizzato ogni 0.025 secondi) e che non siamo arrivati alla fine, mettiamo in pausa l’ambiente e il vento e riproduciamo l’audio dell’esplosione (se il frame corrente è il primo). Aggiorniamo l’immagine corrente e la renderizziamo sullo schermo; prepariamo poi il prossimo frame e rimettiamo il tempo di animazione a zero, perché devono passare altri 0.025 secondi per far renderizzare la prossima immagine.
Facciamo poi un altro controllo alla linea 45 per vedere se siamo giunti a fine animazione ed in questo caso, rimettiamo il frame corrente a zero, l’esplosione a False e il tempo di animazione a zero. Infine se il gioco deve finire, prepariamo le coordinate per renderizzare “Game Over” utilizzando pygame.font. Una volta centrato il testo richiamiamo la funzione notrun, che si occuperà della conclusione del gioco (vedremo il tutto a tempo debito). Ora basti notare che dalle coordinate del centro dello schermo (dividiamo il tutto per due infatti), sottraiamo metà della lunghezza e dell’altezza del testo che vogliamo stampare a video, così che sia perfettamente centrato una volta renderizzato. Se invece il gioco deve proseguire, impostiamo un nuovo volume all’ambiente e al vento (più basso del normale) e togliamo la pausa.
Se l’animazione non è conclusa renderizziamo a video il frame corrente e aggiorniamo il tempo di animazione per poi ritornare.

Start a Conversation

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.