Sviluppare un gioco con Python: i rudimenti

Programmare un videogioco può sembrare una cosa semplice, ma il realtà è molto complessa. Una volta era anche necessario conoscere le specifiche della macchina sulla quale doveva girare il videogioco, ora tutto questo è facilitato grazie a delle librerie reperibili anche da internet e il tutto senza spendere nulla. Infatti non è necessario usare del denaro per creare il proprio videogioco, basta solo guardarsi intorno e avere tanta passione e pazienza.

Per dare vita al nostro gioco per PC abbiamo bisogno di accedere alle periferiche che ci permettono di interagire con il computer, come scheda video, tastiera, mouse ecc… tutto questo lo possiamo fare con librerie come l’OpenGL, SDL ed altre ancora.

Alcune persone, utilizzando queste librerie oppure hanno creato addirittura dei motori grafici, o di gioco, in base alle feature che hanno incluso nel loro tool. Per esempio Crystal Space offre anche un gestore delle collisioni, mentre Irrlicht è un semplice motore grafico che può essere utilizzato insieme ad altre librerie per gestire anche l’audio, la rete ecc…

Se prendiamo invece Panda3D, nel suo pacchetto include tutto quello che necessita per un videogioco, anche online, compresa la gestione dell’IA (n.b. : è da controllare lo stato di quest’ultima). Inoltre in questo pentolone è possibile scegliere il linguaggio che più vi aggrada, che dipende naturalmente dal motore che scegliete; ma sostanzialmente sono tutti legati al C++ come impostazione.

Gestire tutte queste cose da soli è impensabile, ma nulla vieta di provare a creare un piccolo videogioco, anche solo per divertirsi con gli amici e il tutto utilizzando solo il tempo libero, quindi come passatempo. In questo caso ci vengono in aiuto le librerie SDL, semplici e basilari per capire il funzionamento di un gioco per computer ed il linguaggio di programmazione Python, veloce ed intuitivo.

Andremo quindi alla scoperta della libreria Pygame per creare il nostro primo videogioco, imparando a utilizzare i ferri del mestiere a piccole dosi e con un linguaggio alla portata di tutti.

Installazione

Per prima cosa si deve installare l’interprete Python e le rispettive librerie Pygame. Infatti se date un’occhiata alla sezione download del sito potete notare che sono divise in base alla versione Python che dovete utilizzare. Vorrei sottolineare che sia Python che le librerie SDL sono multipiattaforma, quindi potete utilizzarle su tutti gli OS più conosciuti ed utilizzati al momento.

Per gli utenti Windows basta scaricare l’installer Python dal sito ufficiale.

Una volta installato bisogna procurarsi la versione Pygame compatibile. Per esempio se abbiamo installato Python 3.1 dobbiamo scaricare la versione Pygame compatibile, quindi quella che finisce con win32-py3.1 . Una volta avviata l’installazione basta specificare la cartella dove Python è installato. Gli utenti che hanno Windows a 64 bit devono installare le versioni a 32 bit sia dell’interprete Python, sia della libreria Pygame.

Per gli utenti Linux, basta cercare il pacchetto Pygame relativo alla propria distribuzione in uso. Le più conosciute hanno Python installato nativamente e quindi basta installare Pygame utilizzando i repository della propria distribuzione.

Anche in OSX Python dovrebbe essere preinstallato, quindi basta scaricare Pygame dal sito ufficiale e installarlo seguendo le instruzioni.

Una volta completata l’installazione possiamo verificare il corretto funzionamento aprendo l’IDLE Python e dando i comandi :

>>>import pygame
>>>pygame.init()

Se non risultano errori, l’installazione è avvenuta con successo e potete subito iniziare ad utilizzare le librerie.

Python

Per chi già conosce un linguaggio di programmazione C++ like, non sarà difficile utilizzare il Python. Online sono disponibili svariate guide gratuite, come questa del sito ufficiale :

Potete poi trovare tutti i riferimenti al Python in lingua italiana qui.

La conoscenza di questo linguaggio di programmazione ha una curva molto bassa di apprendimento, quindi mi limiterò a sottolineare le differenze più evidenti, come per esempio il fatto che, al contrario di molti linguaggi di programmazione, il Python non necessita di parentesi per identificare il blocchi di codice. Un blocco si differenzia dall’altro in base alle indentature (spazi o tab) che li separa dal bordo. Ecco un esempio:

>>>Blocco A
>>>    Blocco B
>>>Blocco A
>>>    Blocco C
>>>        Blocco D
>>>        Blocco D
>>>    Blocco C
>>>Blocco A

L’altra differenza importante è che si lavora sostanzialmente con oggetti. Naturalmente non sarà niente di nuovo per quelle persone che già programmano, ma per chi non si è mai cimentato, si consiglia almeno di leggere il tutorial, per capire il codice che poi andremo a scrivere.

Ciao Mondo!!!

Come primo file di esempio, creeremo una semplice finestra dove disegneremo un’immagine fatta da noi. Commenteremo riga per riga il codice.

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!!!")

sfondo = pygame.image.load(imm_sfondo).convert()

while True:

    for event in pygame.event.get():

        if event.type == QUIT:

            exit()

    screen.blit(sfondo,(0,0))

    pygame.display.flip()

Commenti al codice

imm_sfondo = "ciaomondo.jpg"

Con questa riga di codice memorizziamo il nome della nostra immagine di sfondo, che per essere visualizzata corretamente dovrà essere di 640×480 pixel, vedremo poi perché.

import pygame

from pygame.locals import *

from sys import exit

Con questi comandi importiamo le librerie necessarie, ovvero le librerie pygame nella prima riga, le variabili locali nella seconda e l’uscita per il programma dalle librerie di sistema nell’ultima. Fra poco vedremo a cosa servono.

pygame.init()

La libreria Pygame è divisa in moduli che gestiscono vari tipi di eventi, per esempio display gestirà lo schermo, mentre mixer servirà per caricare e gestire eventi sonori. Tutti i moduli sono avviabili singolarmente, ma con pygame.init() li avvieremo tutti insieme, così che rimarranno a nostra disposizione quando ne avremo bisogno.

Caricare i moduli singolarmente ne guadagnerà in velocità, perché se per esempio non abbiamo bisogno dell’audio, si caricheranno cose inutilizzate in memoria, rallentando di conseguenza il programma. Per questo codice di esempio non fa nessuna differenza, ma in un progetto più complesso, l’ottimizzazione ha la sua buona parte per la riuscita del videogioco.

screen = pygame.display.set_mode((640,480), DOUBLEBUF | HWSURFACE, 32)

Con questa creiamo una finestra 640×480 con doppio buffer (da notare che dobbiamo scrivere solo DOUBLEBUF e non pygame.DOUBLEBUF perché abbiamo importato le variabili locali), accelerazione hardware (HWSURFACE) e con profondità 32 bit.

pygame.display.set_caption("Ciao Mondo!!!")

Qui settiamo il nome della finestra che abbiamo creato.

sfondo = pygame.image.load(imm_sfondo).convert()

Ora carichiamo lo sfondo e lo convertiamo in una superficie per essere visualizzato sullo schermo. La conversione è necessaria per essere correttamente disegnato sullo schermo.

while True:

    for event in pygame.event.get():

        if event.type == QUIT:

            exit()

    screen.blit(sfondo,(0,0))

    pygame.display.flip()

Questo è il vero corpo di gioco, per ora. Il primo ciclo equivale in poche parole ad una frame di gioco, mentre il secondo è indispensabile per controllare gli eventi al di fuori del gioco per far interagire l’utente. In questo caso basta controllare solamente se viene premuto il tasto di uscita della finestra (la ‘x’ della cornice).

Grazie a screen.blit, disegniamo il nostro sfondo dalle coordinate (0,0) in poi. Essendo la nostra finestra 640×480 pixel, è per questo motivo che l’immagine da visualizzare deve essere altrettanto grande, altrimenti sarebbe visualizzata solo una porzione. Vi ricordo che le coordinate dello schermo hanno l’origine nell’angolo in alto a sinistra e quindi anche le operazioni che fate sulle immagini tengono conto di questo.

L’ultima riga è un po’ più complessa da spiegare: avendo utilizzato l’accelerazione hardware abbiamo aggiunto un secondo buffer; in poche parole in questo secondo buffer il computer si prepara il prossimo frame da visualizzare. Quindi quando stampiamo a video la nostra immagine non dobbiamo ridisegnare da capo, ma dobbiamo semplicemente scambiare il buffer attuale con quello successivo. In questo modo si evitano discrepanze visive dovute al refresh della memoria video che deve ridisegnare ogni volta la stessa immagine sullo stesso buffer.

Conclusioni

Con questo primo articolo abbiamo introdotto i rudimenti della libreria per scrivere un piccolo codice di esempio, più avanti entreremo nel dettagli per affinare tutti gli strumenti necessari per la creazione del nostro videogioco.

Press ESC to close