Introduzione
Inizia con questa prima parte il consolidamento delle nostre conoscenze attuali. L’esempio che voglio proporvi è un pò corposo per digerirlo tutto insieme, quindi vi illustrerò il quadro generale per passare poi all’analisi pezzo per pezzo, così potrò anche rispondere ad eventuali dubbi riguardo certi argomenti.
Nel seguente esempio muoveremo il nostro personaggio (che si animerà) e si sentiranno i rumori dei passi mentre cammina. Con la barra spaziatrice attiveremo un rumore d’ambiente, in particolare il rumore sarà del vento e una pioggia con tuoni in lontananza, anche se per il momento non viene simulata la pioggia sullo schermo. Come nel precedente esempio si può fermare e far partire la musica di sottofondo, che è completamente slegata dagli effetti. Inoltre, premendo il tasto invio, verranno lanciate delle esplosioni (con animazione), che attenueranno il rumore di fondo dell’ambiente per poi farlo tornare ai valori normali, come in una vera esplosione. Infine, se calpesteremo una di queste “bombe”, il gioco terminerà, dandoci la possibilità di ricominciare premendo invio, o di unscire tramite gli usuali tasti ESC e ALT+F4, usati anche negli altri esempi.
Per le sprites mi sono appoggiato a questo sito: http://www.charas-project.net/resources.php?lang=en; mentre per la texture dello sfondo ho cercato qui: http://www.tellim.com/texture_cd/; infine i suoni utilizzati provengono da: http://www.freesound.org/. In questi siti potete trovare molto spesso le cose più comuni di cui avete bisogno in un videogioco. Naturalmente, utilizzare proprie creazione, porta molta più soddisfazione. I contenuti da me utilizzati sono di libera fruizione, potete trovare altri siti di questo genere; sono indicati anche nella sezione Risorse della libreria pygame : http://www.pygame.org/wiki/resources. Se avete intenzione di creare voi stessi i contenuti del vostro videogioco, ma anche se volete semplicemente affinare quello che trovate sulla rete (diritti d’autore permettendo), vi saranno molto utili dei programmi di ritocco grafico, come GIMP; dei programmi per modificare i suoni, come Audacity; ed infine per la grafica 3D, come Blender. I programmi suggeriti sono gratuiti ed open source, inoltre internet è pieno di guide e la difficoltà di apprendimento è minima, con un pò di applicazione; sarebbe quindi una buona cosa prendere mano con essi.
Il videogioco è composto in questo caso da cinque funzioni e due classi che sono riportate di seguito:
import pygame from pygame.locals import * from sys import exit def carica_imm_sprite(nome,h,w,num): def agg_rect(sprite): def tps(orologio, fps): class oggetto_esplosione(pygame.sprite.Sprite): class oggetto_sprite(pygame.sprite.Sprite): def notrun(screen,x,y): def run(): if __name__ == "__main__": run()
- La prima funzione serve per caricare i vari frame di una sprite che sono necessari per creare l’animazione. La funzione è stata pensata per caricare le immagini con il “nome” del file passato (sempre in formato .png) e per memorizzari i vari frame, sia che essi siano in più file (quindi va indicato il numero di file che compongono l’animazione passando “num”), sia che il file sia uno solo, ed in quest’ultimo caso si appoggerà alle variabili di larghezza (“w”) e altezza (“h”) opportunamente passate per suddividere l’immagine in frame.
- La seconda funzione è stata creata per necessità. Infatti c’è un bug che concerne la funzio Rect.move_ip, che muove un oggetto rect secondo le coordinate passategli. In poche parole, la funzione non supporta dei movimenti con numeri float, quindi ho dovuto riadattare la funzione per far funzionare l’esempio. In certi casi questa può essere una grave limitazione, ma a seconde delle collisioni che gestite (rect, rect circolari, mask …) dovete controllare e testare il funzionamento corretto. Tutto sta per non perdere il realismo del videogioco, quindi tenetelo bene in mente. Per il nostro esempio ho pensato di adattarlo, così da far vedere anche come poteva essere una possibile soluzione al problema.
- La terza funzione è la più semplice, ma non la meno importante: infatti tiene il tempo di gioco e serve per sincronizzare movimenti e animazioni.
- Poi abbiamo due classi che gestiscono le esplosioni e il giocatore (da notare che estendono la classe Sprite di pygame). Infatti un oggetto Sprite non è niente altro che un’immagine affiancata da un oggetto rect, così da poter gestire le collisioni. Le sprites sono molto utili anche perché possono essere gestite in gruppi, permettendoci quindi di gestire anche, per esempio, profondità, collisioni multiple e renderizzazioni molto più facilmente di pitturare immagini sullo schermo.
- Le ultime due funzioni gestiscono il loop di gioco: notrun() per quando il gioco termina, mentre run() per il gioco avviato. La condizione alla fine invece ci permette di utilizzare questo script sia come modulo che come programma stand-alone.
Conclusioni
Per ora abbiamo visto solo cosa il programma dovrà fare e le dichiarazioni delle varie funzioni che andremo ad analizzare. Intanto affinate i coltelli cercando di preparare i cinque suoni che ci serviranno per la demo:
- Il rumore di un passo sul prato.
- Il rumore di un altro passo, diverso dal primo, per dare l’effetto di camminare regolarmente e non di saltellare sulla stessa gamba.
- Un’esplosione. Quella utilizzata da me dura circa tre secondi (il tempo è fondamentale perché dovete coordinare il numero di frame dell’esplosione (nel mio caso 8) con il tempo di esecuzione del suono, così da non avere un’animazione troppo veloce con l’audio in ritardo o ancora in esecuzione alla fine di essa).
- Il suono del vento.
- Il rumore della pioggia con dei fulmini.
Come ho già detto, potete cercare di creare voi stessi questi suoni, oppure potete reperirli nei link sopra citati. Vi ricordo che alcuni suoni devono avere una certa lunghezza, come per esempio quello dei passi, che al massimo sarà di un secondo.
Cercherò di essere il più chiaro possibile nella spiegazione delle varie parti del gioco, così da rendervi in grado di modificare, utilizzare e creare quello che voi avete in mente. Realizzare un videogioco non è semplice, ma una buona realizzazione richiede moltissima passione e tanta voglia di imparare e mettersi alla prova, quindi non vi resta che attendere il prossimo pezzo, magari cercando anche una buona canzone per il sottofondo della vostra demo.