Per iniziare la nostra esplorazione di pygame avremo per prima cosa bisogno di una cartella dove salvare i nostri file: vi consiglio di creare una cartella "pygame" nella vostra cartella "Documenti", in modo da poterli salvare e ritrovare facilmente. Per editare i programmi potete usare IDLE (alla quale farò riferimento nel seguito) oppure, se la sapete usare, qualche IDE più evoluta come Wing o PyCharm. Potete digitare il codice o, per i programmi più lunghi, copiarlo e incollarlo; spesso vi chiederò, per esercizio, di fare delle modifiche.
Trovo molto utile, come metodo di lavoro, indicarvi io stesso con quale nome salvare i vostri file. Quando trovate un'indicazione come questa:
Ora iniziamo con il primo programma:
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
Diamo il Run e vedremo, oltre alla consueta finestra di IDLE, una nuova finestra (che chiameremo da ora in poi la finestra di pygame): è il nostro primo passo nel mondo della grafica!
A dire il vero non è un passo tanto esaltante: la finestra è tutta nera, possiamo minimizzarla e riportarla sul desktop con il bottone in alto a destra. Se però tentiamo di chiuderla cliccando il bottone con la crocetta otterremo un errore e dovremo chiudere la finestra dell'editor per terminare il programma (oppure usare il task manager di Windows premendo Ctrl Alt Canc insieme).
Prima di continuare vediamo di analizzare quello che abbiamo scritto:
init()
di pygame: essa serve ad
inizializzare tutti i sottomoduli e deve sempre essere chiamata prima di tutte le altre funzioni di pygame;set_mode()
del sottomodulo display
:
questa funzione prende come parametro una tuple di due numeri (larghezza ed altezza) e crea la finestra principale
con le dimensioni assegnate. Ricordo che in Python una tuple è una lista che non si può modificare e i cui elementi vanno
scritti tra parentesi tonde (ecco perchè c'è bisogno delle doppie parentesi: una parentesi è per la funzione ed una per la
tuple).screen
. Ma cosa ha restituito la funzione? Bene, si tratta di un oggetto di tipo Surface,
cioè un oggetto di pygame che rappresenta una superficie, e che corrisponde all'area della finestra appena
aperta. Nella prossima lezione vedremo più in dettaglio come usare l'oggetto Surface, per ora ci basta sapere che screen
nel programma rappresenta la nostra finestra.Come ho già detto il sottomodulo display
di pygame raggruppa una serie di funzioni che controllano la
visualizzazione della finestra principale. Aggiungiamo adesso queste righe:
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Il mio primo programma")
screen.fill((255, 255, 255))
pygame.display.flip()
Se diamo il Run troviamo due novità: la finestra ora è bianca ed ha cambiato titolo. Vediamo perchè
set_caption()
del sottomodulo display
:
essa serve proprio a cambiare il titolo della finestra (caption in inglese) con la string che gli
passiamo come argomento;fill()
alla nostra variabile screen
,
scrivendo screen.fill((255, 255, 255))
. Il metodo fill()
, applicato ad una variabile di
tipo Surface
, prende come parametro un colore (una tuple di 3 numeri) e colora tutta la superficie con il
colore dato.display
: la flip()
che
serve ad aggiornare la finestra principale. Quando disegniamo qualcosa dobbiamo sempre chiamare la funzione
flip()
perchè le modifiche divengano effettive.Quest'ultimo procedimento potrebbe sembrarvi piuttosto seccante, ma è un comportamento voluto: se quello che disegniamo si vedesse immediatamente, nel caso di disegni piuttosto complessi il nostro occhio potrebbe percepire l'avanzare del disegno e si avrebbe il flickering (sfarfallio dello schermo). Così invece è possibile fare modifiche grafiche anche complicate e poi mostrare il risultato tutto in una sola volta, migliorando di molto la qualità video.
A partire dalla versione 2 pygame definisce una tabella con più di 600 named colors (la trovate qui) che possono essere indicati, più facilmente, per mezzo di una string con il loro nome. Questo ci permette di scrivere, nella riga #6:
screen.fill("white")
invece di
screen.fill((255, 255, 255))
In ogni modo consiglio di esercitarsi anche con le tuple RGB (cercando di indovinare un colore a partire dai suoi 3 valori), perchè un buon programmatore di videogiochi deve conoscere bene questo modello.
Se invece siete già esperti potete usare, sempre dalla versione 2, una stringa in formato HTML "#rrggbb" o esadecimale "0xrrggbb", dove rr, gg, bb sono i valori esadecimali per il rosso, verde e blu.
Se cercate di usare le funzioni di Python che già conoscete, vi accorgerete che esse non scrivono sulla finestra che abbiamo creato, ma continuano a scrivere sulla finestra di IDLE. Per scrivere sulla finestra di pygame dovremo usare delle apposite funzioni di pygame stesso.
Comunque è possibile utilizzare per il momento queste funzioni per scrivere programmi "ibridi", per metà su IDLE e per metà nella
finestra di pygame. Ricordate che quando diamo il run compare immediatamente la finestra di I/O di IDLE, mentre la finestra di pygame
compare solo nel momento in cui chiamiamo la funzione set_mode().
Un primo semplice utilizzo è quello di far terminare il programma senza errori. Aggiungete alla fine del programma queste altre due righe:
. . .
input("Premi INVIO per terminare il programma")
pygame.quit()
Nella prima delle due nuove righe chiamiamo la input()
, non per prendere qualche dato in ingresso, ma semplicemente
per fare in modo che il programma si fermi ed attenda che premiamo INVIO (infatti il risultato della funzione non viene assegnato
a nessuna variabile e va perso). Nella seconda chiamiamo la funzione quit()
di pygame. La funzione
quit()
"spegne" tutti i moduli di pygame, chiude la finestra e ritorna al sistema operativo senza errori.
Va sempre chiamata per ultima, altrimenti, come abbiamo visto, la finestra di pygame non si chiuderà correttamente. In questo modo
il programma aprirà la finestra di pygame, si fermerà e la chiuderà quando premiamo INVIO (attenzione: è necessario prima cliccare
sulla finestra di IDLE per renderla attiva). Va detto che questa soluzione è decisamente poco elegante, ma è provvisoria ed impareremo
presto a chiudere la finestra cliccando sulla crocetta in alto a destra. Provate, per esperimento, a commentare (inserendo un #
all'inizio) la riga con la input()
: cosa succede?
Nei prossimi due esercizi dovete prima fornire dei dati a Python (usando la input()
nella finestra di IDLE) e poi
aprire la finestra di pygame in base ad essi.
set_mode()
) il programma deve chiedere il titolo usando
la funzione input()
di Python (e noi la immetteremo nella finestra di IDLE), poi aprirà la finestra di pygame ed imposterà
la caption immessa.num = int(input(" . . . "))
perchè
input()
restituisce sempre una stringa.Fine della lezione