Inserire immagini in pygame

Inserire immagini in pygame

In questa lezione impareremo ad inserire immagini in pygame.

Innanzitutto presentiamo la funzione che serve a caricare un’immagine, cioè la funzione load che si trova nel sotto modulo image: pygame.image.load().

All’interno delle parentesi si indica il nome dell’immagine, facendo attenzione ad indicare il percorso esatto se l’immagine non è nella stessa cartella del file che creeremo.

Ecco dunque un esempio:

auto=pygame.image.load('images/auto.png')

Possiamo invece utilizzare pygame.transform.scale per ridimensionare un’immagine, anche se non è la scelta migliore da fare. Infatti le immagini vanno scalate con appositi programmi prima di caricarle.

auto=pygame.transform.scale(auto,(300, 150))


Inserire immagini in pygame e muoverle

Realizziamo adesso un semplice esempio in cui carichiamo un’immagine e dopo la sposteremo dalla posizione iniziale.

Innanzitutto prendiamo un’immagine a piacere e la carichiamo con la funzione load. Dopo stabiliamo le coordinate iniziali x e y.

Poi realizziamo gli eventi legati ai pulsanti freccia su, freccia giù, freccia a sinistra e freccia a destra, variando di conseguenza le coordinate quando premiamo i tasti. Possiamo omettere il print che spiega cosa succede quando premiamo il pulsante specificato, l’ho inserito solo a scopo dimostrativo.

Per rendere effettive le modifiche inseriamo pygame.display.update().

Ecco dunque il codice completo.

import pygame, sys
from pygame.locals import *

pygame.init()
screen=pygame.display.set_mode((800, 600))
pygame.display.set_caption('Muovere immagini')

CYAN=(0,255,255)
car=pygame.image.load('images/car.png')
x=10
y=50

while True:
    screen.fill(CYAN)
    screen.blit(auto, (x,y))
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                print('Vai su')
                y-=5
            elif event.key == pygame.K_DOWN:
                print('Vai giù')
                y+=5
            elif event.key == pygame.K_LEFT:
               print('Vai a sinistra')
               x-=5
            elif event.key == pygame.K_RIGHT:
                print('Vai a destra')
                x+=5
        pygame.display.update()


Immagini in movimento

Realizziamo adesso un esempio creando un’immagine in movimento.

Utilizziamo l’oggetto Clock, un oggetto utilizzato per misurare i millesimi di secondo.

Specifichiamo l’FPS, ovvero il numero di frame in un secondo, che verrà passato come argomento al metodo tick().

Il metodo tick lo chiameremo per ultimo e si occupa di arrestare il movimento per il tempo necessario ad ottenere la temporizzazione.

Utilizziamo una variabile d che sta per direzione a cui faremo assumere i valori tra 1 e 4. Il valore 1 sta ad indicare che l’oggetto si muoverà a destra, il valore 2 indica che l’oggetto si muoverà sotto, il valore 3 indica invece che l’oggetto si muoverà a sinistra, infine il valore 4 indica che l’oggetto si muoverà su.

Ecco dunque il codice completo:

import pygame, sys

pygame.init()

YELLOW=(255, 255, 0)

screen=pygame.display.set_mode((800, 600), 0, 32)
pygame.display.set_caption('Animation')

ball=pygame.image.load('images/palla.png')
x=0
y=0
d=1

FPS=20
cl=pygame.time.Clock()

while True: 
    screen.fill(YELLOW)
    screen.blit(ball, (x, y))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    if d==1:  #va a destra
        x += 10
        if x==300:
            d=2 #imposta la direzione per andare giù
    elif d==2: #va giù
        y+=10
        if y==300:
            d=3 #imposta la direzione per andare a sinistra
    elif d==3: #va a sinistra
        x-=10
        if x==0:
            d=4 #imposta la direzione per andare sotto
    elif d==4: #va su
        y -= 10
        if y==0:
            d=1

    pygame.display.update()
    cl.tick(FPS)

Alcuni link utili

Indice tutorial sul linguaggio python

1 – Introduzione al linguaggio python

2 – Le variabili in python

3 – Operatori aritmetici e di assegnazione in python

4 – Stringhe in python

5 – Casting in python

6 – Input e print in python

7 – Primi esercizi in python

8 – Errori in python

9 – Script python

10 – Scambio di variabili in python

Eventi in pygame

Eventi in pygame

In questa lezione studieremo gli eventi in pygame, necessari per interagire con il nostro programma.

Per capire come funzionano gli eventi facciamo un semplice esempio.

Quando lavoriamo al computer il sistema operativo gestisce e controlla tutto, se facciamo clic con il mouse, se premiamo un tasto sulla nostra tastiera, ecc.

Dunque, quando facciamo qualcosa, il sistema operativo genera un evento di sistema, cioè in poche parole crea un messaggio con le informazioni di ciò che è accaduto. Questi messaggi vengono poi messi in una coda, in ordine di arrivo, in quanto ci possono essere tanti eventi di sistema.

Le applicazioni che ricevono questi messaggi possono ignorarli oppure esaminarli per capire cosa fare.

Eventi in pygame con l’oggetto Event

Pygame ha l’oggetto Event, quindi registra gli eventi dell’utente in una coda di eventi che può essere ricevuta con il codice pygame.event.get().

Dunque ad esempio proviamo a scrivere questo semplice programma:

import pygame

pygame.init()
pygame.display.set_mode((800, 600))

#riceviamo gli eventi
for event in pygame.event.get():
    print("Evento: ", event)

Adesso provate questo codice, potete notare che compariranno tutti gli eventi che si sono generati per aprire la finestra che abbiamo creato con set_mode.

Ma il programma così costruito non continua a registrare eventi.

Per fare ciò abbiamo bisogno di un altro ciclo esterno che quando termina gli eventi precedenti, registra quelli nuovi.

Quindi modificate il codice in questo modo:

import pygame

pygame.init()
pygame.display.set_mode((800, 600))

#riceviamo e rigeneriamo nuovi eventi
while True:
    for event in pygame.event.get():
        print('Evento: ', event)

In questo modo se ad esempio muoviamo il mouse noteremo che i nuovi eventi saranno stampati nella finestra di output.

Attributo type

L’attributo type contiene il tipo dell’evento, ad esempio:

QUIT  – per indicare che è stato fatto clic sull’icona per chiudere la finestra.

MOUSEMOTION – è stato mosso il mouse.

MOUSEBUTTONDOWN – è stato premuto un bottone del mouse.

MOUSEBUTTONUP – è stato rilasciato il bottone del mouse.

KEYDOWN – è stato premuto un tasto della tastiera.

KEYUP – è stato rilasciato un tasto della tastiera.


Esempio con QUIT

Possiamo fare in modo di uscire dal programma utilizzando il type QUIT, cambiando la variabile t a False quando si clicca sull’icona per chiudere la finestra:

import pygame

pygame.init()
pygame.display.set_mode((800, 600))

t=True
while t:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            t=False

La funzione pygame.quit() serve per terminare il programma.

Si può anche importare il modulo sys ed utilizzare sys.exit():

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()

Esempi con MOUSEBUTTONDOWN e MOUSEBUTTONUP

Button è un numero intero e rappresenta quindi il pulsante premuto.

Con 1 si indica il pulsante sinistro, con 3 il pulsante destro mentre con 2 la pressione sulla rotella del mouse, con 4 lo spostamento della rotellina verso l’alto e con 5 lo spostamento della rotellina verso il basso.

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                print('Left button')
            elif event.button == 3:
                print('Right button')
        elif event.type == pygame.MOUSEBUTTONUP:
                print('Pulsante rilasciato')

Facciamo adesso un secondo esempio d’uso di MOUSEBUTTONDOWN dove visualizzeremo le coordinate x e y al clic del mouse.

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))


while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            p_x = event.pos[0]
            p_y = event.pos[1]
            print('Hai fatto click in x =',p_x,' e y =',p_y)

Esempi con MOUSEMOTION

MOUSEMOTION viene ricevuto quando spostiamo il mouse sul display.

Ha gli attributi:

pos che rappresenta la posizione assoluta in pixel del cursore e

rel che è la posizione relativa a quella precedente.

Quindi se rel [0] è maggiore di zero vuol dire che ci siamo spostati a destra, invece se è minore a sinistra.

Se invece rel [1] è maggiore di zero vuol dire che ci siamo spostati in basso, al contrario se è minore in alto.

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEMOTION:
            if event.rel[0] > 0: 
                print('Ti stai spostando a destra')
            elif event.rel[0] < 0:
                print('Ti stai spostando a sinistra')
            elif event.rel[1] > 0:  
                print('Ti stai spostando sotto')
            elif event.rel[1] < 0:  
                print('Ti stai spostando sopra')

Esempi con KEYDOWN

L’evento keydown ha un attributo key che è un numero intero e rappresenta un tasto della tastiera. Indica quindi quale tasto è stato premuto.

Ad esempio con:

k_UP si indica la freccia in alto,

k_DOWN la freccia in basso,

k_ESCAPE il tasto ESC,

k_TAB il pulsante TAB,

k_w la lettera w della tastiera, ecc…

Ecco dunque un semplice esempio:

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                print('Vai su')
            elif event.key == pygame.K_a:
                print('Vai a sinistra')
            elif event.key == pygame.K_s:
               print('Vai giù')
            elif event.key == pygame.K_d:
                print('Vai a destra')

Facciamo adesso un altro esempio, stampando il carattere se l’attributo unicode contiene effettivamente un carattere.

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))


while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:            
            if (len(event.unicode)) == 1:
                print(event.unicode) 
            else:
                print('Non stampabile')

Alcuni link utili

Indice tutorial sul linguaggio python

1 – Introduzione al linguaggio python

2 – Le variabili in python

3 – Operatori aritmetici e di assegnazione in python

4 – Stringhe in python

5 – Casting in python

6 – Input e print in python

7 – Primi esercizi in python

8 – Errori in python

9 – Script python

10 – Scambio di variabili in python

Costruire altre Surface

Costruire altre Surface

In questa lezione vedremo come costruire altre Surface, cioè delle aree su cui disegnare.

Possiamo creare altre Surface con la funzione costruttore, ricordiamo che nei linguaggi OOP ogni oggetto ha una particolare funzione, chiamata costruttore, che è designata a creare un’istanza dell’oggetto.

Il costruttore ha il medesimo nome dell’oggetto e se è contenuto in un sotto modulo di pygame si chiama anteponendo pygame ed il nome del sotto modulo.

Come costruire altre Surface

Vediamo dunque un esempio pratico.

import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))

RED=(255, 0, 0)
WHITE=(255,255,255)
BLACK=(0,0,0)
GREEN=(0,255,0)
BLUE=(0,0,255)
YELLOW=(255,255,0)
CYAN=(0,255,255)

screen.fill(CYAN)

surf = pygame.Surface((100, 100))
surf.fill(WHITE)
pygame.draw.circle(surf, RED, (50, 50), 49)

surf2 = pygame.Surface((100, 100))
surf2.fill(BLUE)
points = [(50, 0), (100, 50), (50, 100), (0, 50)]
pygame.draw.polygon(surf2, GREEN, points)

surf3 = pygame.Surface((100, 100))
surf3.fill(YELLOW)
points = [(50, 0), (100, 50), (50, 100), (0, 50)]
pygame.draw.polygon(surf3, BLACK, points,1)

screen.blit(surf, (50, 50))
screen.blit(surf2, (150, 50))
screen.blit(surf3, (250, 50))

pygame.display.flip()

Se provate ad eseguire il programma otterrete questo risultato:

forme in python

Per realizzare questo esempio innanzitutto abbiamo creato una nuova Surface quadrata di 100 x 100 pixel e abbiamo assegnato questa Surface alla variabile surf. Dopo la coloriamo di colore bianco con il metodo fill e disegniamo un cerchio utilizzando il sotto modulo draw.

Allo stesso modo abbiamo creato altre due Surface e le abbiamo assegnate alle variabili surf2 e surf3 . Quindi le abbiamo colorate e abbiamo disegnato dei poligoni dentro queste Surface.

Dopo abbiamo utilizzato il metodo blit, su surf, surf2 e surf3, dell’oggetto Surface, che serve a rendere visibile le Surface che abbiamo creato.

Alcuni link utili

Indice tutorial sul linguaggio python

1 – Introduzione al linguaggio python

2 – Le variabili in python

3 – Operatori aritmetici e di assegnazione in python

4 – Stringhe in python

5 – Casting in python

6 – Input e print in python

7 – Primi esercizi in python

8 – Errori in python

9 – Script python

10 – Scambio di variabili in python