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

Pygame per disegnare sullo schermo

Pygame per disegnare sullo schermo

In questa lezione vedremo come utilizzare pygame per disegnare sullo schermo.

Nella scorsa lezione abbiamo visto come importare la libreria pygame e abbiamo creato la nostra prima finestra, adesso vedremo come personalizzarla.

Proviamo quindi a colorare lo sfondo. Ricordiamo alcuni colori in RGB.

Bianco – RGB(255,255,255)

Nero – RGB(0,0,0)

Rosso – RGB(255,0,0)

Verde – RGB(0,255,0)

Blu – RGB(0,0,255)

Giallo – RGB(255,255,0)

Magenta – RGB(255,0,255)

Ciano – RGB(0,255,255)


Quindi supponiamo di voler creare una finestra con lo sfondo giallo.

import pygame

pygame.init()

screen=pygame.display.set_mode((640,480))

pygame.display.set_caption(‘Coding Creativo’)

 

GIALLO=(255, 255, 0)

screen.fill(GIALLO)

pygame.display.flip()

In Python il colore si rappresenta con un tupla e quindi per il giallo impostiamo la tupla (255,255,0).

Applichiamo poi il metodo fill all’istanza dell’oggetto screen, ovvero la variabile che abbiamo creato in precedenza. In questo modo coloreremo la nostra finestra di giallo.

Utilizziamo poi la funzione flip del sotto-modulo display affinché le modifiche diventino effettive.

Quando dobbiamo disegnare qualcosa occorre sempre chiamare la funzione flip per rendere effettive le modifiche.


Utilizzare Pygame per disegnare sullo schermo.

Per disegnare sullo schermo possiamo utilizzare il sotto – modulo draw.

Il sotto modulo draw di pygame contiene alcune funzioni:

pygame.draw.circle – disegna un cerchio

pygame.draw.circle (superficie, colore, pos, raggio, larghezza)

pygame.draw.polygon – disegna un poligono

pygame.draw.polygon (superficie, colore, lista puntiforme, larghezza)

pygame.draw.rect – disegna un rettangolo

pygame.draw.rect (superficie, colore, Rettangolo, larghezza

pygame.draw.ellipse – disegna un’ellisse

pygame.draw.ellipse (superficie, colore, Rettangolo, larghezza)

pygame.draw.arc – disegna un arco

pygame.draw.arc (superficie, colore, Rect, start_angle, stop_angle, width = 1)

pygame.draw.line – disegna un segmento di linea retta

pygame.draw.line (superficie, colore, start_pos, end_pos, larghezza = 1)

pygame.draw.lines – disegna più segmenti di linea contigui

pygame.draw.lines (superficie, colore, chiuso, lista puntiforme, larghezza = 1)

pygame.draw.aaline – disegna una linea sottile antialias

pygame.draw.aaline (superficie, colore, startpos, endpos, blend = 1)

pygame.draw.aalines – disegna una sequenza di linee antialias

pygame.draw.aalines (superficie, colore, chiuso, elenco punti, blend = 1)

Dove:

superficie – rappresenta la superficie sulla quale disegnare la forma.

colore – Rappresenta il colore che si vuole utilizzare. Es. (255,0,0)

pos – Rappresenta la posizione del centro del cerchio.

raggio – Rappresenta il raggio del cerchio in pixel.

larghezza – Rappresenta la posizione della linea o del contorno della forma. Se larghezza è uguale a 0 la forma sarà riempita.

rettangolo – area rettangolare dove verrà disegnata la forma.

lista puntiforme – Rappresenta un elenco di una quantità arbitraria di punti, in pixel (x, y). 

blend – verrà disegnata una linea tra il primo e l’ultimo punto se vero.

star_angle – Angolo iniziale in radianti

stop_angle – Angolo finale in radianti

star_pos – Posizione iniziale della linea in pixel

stop_angle – Posizione finale della linea in pixel

Facciamo dunque degli esempi, disegnando alcune forme.

import pygame

pygame.init()
screen=pygame.display.set_mode((640,480),0,32)
pygame.display.set_caption('Coding Creativo')

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(YELLOW)

pygame.draw.circle(screen, GREEN, (30, 30),  10, 1)
pygame.draw.circle(screen, RED, (90, 30),  20, 0)
pygame.draw.line(screen, BLUE, (150, 30), (200, 30))
pygame.draw.rect(screen, BLACK,(230, 20, 30, 30),1)
pygame.draw.rect(screen, BLUE,(300, 10, 70, 60))
pygame.draw.ellipse(screen, CYAN, (390, 10, 80, 40), 0)

pygame.display.flip()

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

Pygame

Pygame

Pygame è un insieme di moduli, free and open source, progettati per creare dei videogiochi.

Come installare pygame

Per l’installazione occorre seguire dunque questi semplici passaggi:

1 -Per prima cosa occorre controllate che abbiate installato Python seguendo le istruzioni al link: https://www.codingcreativo.it/il-python/

Infatti se in fase di installazione non avete selezionato Add Python 3.X to PAT rivedete i passaggi.

2 – Per prima cosa, bisogna aprire il prompt dei comandi, digitando cmd sulla barra dei programmi in basso a sinistra.

3 – Dopo, digitare python3 -m pip install -U pygame –user

4 – Quindi aspettare che i file necessari vengano scaricati da internet

5 – Infine controllare che tutto sia andato bene, aprendo l’IDLE e digitando:

>>> import pygame

Se non compare un messaggio di errore allora avete terminato l’installazione dei moduli.

Altrimenti può anche essere che pip non sia aggiornato, occorre allora farlo.

Quindi digitate per Windows:

python -m pip install -U pip

per Linux:

sudo apt install python3-pip

N.B. Se nel prompt dei comandi digitate python -m pygame.examples.aliens potete vedere una demo del gioco aliens.


Primo programma – Creazione della finestra

Creiamo quindi, come primo esempio, una semplice finestra con il titolo Coding Creativo.

import pygame

pygame.init()

screen=pygame.display.set_mode((640,480))

pygame.display.set_caption(‘Coding Creativo’)

Innanzitutto abbiamo, all’inizio del programma, importato il modulo.

Dopo abbiamo inserito la funzione init() che serve ad inizializzare tutti i sotto-moduli e deve essere chiamata prima di tutte le altre.

Poi abbiamo utilizzato la funzione set_mode del sotto-modulo display che serve a creare la finestra con le dimensioni assegnate.

Assegniamo alla variabile screen il risultato della funzione, la quale restituisce un oggetto di tipo Surface. Un oggetto Surface è un oggetto che rappresenta la superficie, ovvero l’area della finestra aperta.

Un oggetto surface è caratterizzato dalla risoluzione e dal formato dei pixel.

All’interno della funzione set_mode si inserisce la tupla con i valori di larghezza e altezza della finestra, cioè la risoluzione, in questo caso 640 x 480.

Infine la funzione set_caption, sempre del sotto-modulo display, che serve a creare la finestra con le dimensioni assegnate.

In questo caso inseriamo come titolo di esempio ‘Coding Creativo‘.


In alternativa potremmo anche utilizzare:


from pygame import *

init()

schermo=display.set_mode((640,480))

display.set_caption(‘Coding Creativo’)


In questo modo si evita di digitare ogni volta pygame prima di ogni funzione.

Sebbene questo metodo potrebbe sembrare più semplice è però meno utilizzato.

Continueremo nella prossima lezione con tanti altri esempi.


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