da Cristina | Nov 3, 2019 | Pygame
Realizziamo il semplice gioco acchiappa il fantasma con pygame, utilizzando gli strumenti appresi finora.
Più avanti perfezioneremo il gioco utilizzando gli sprite e altri metodi, per il momento mi preme far vedere come, con semplici strumenti, si può realizzare il nostro giochino.
Gioco acchiappa il fantasma con pygame
Creiamo il nostro fantasma con sfondo trasparente e salviamo l’immagine con estensione .png nella cartella images.
Dopo impostiamo il colore di sfondo grigio scuro e la finestra di dimensione 800 x 600 pixel con il titolo Ghost.
Poi inseriamo l’immagine e la memorizziamo in una variabile di nome ghost.
Introduciamo due nuovi metodi convert() e convert_alpha() che trasformano il formato interno della Surface in un formato ottimizzato e più veloce per essere disegnato dalla blit().
Il metodo convert_alpha si usa con le immagini con lo sfondo trasparente, proprio come nel nostro caso.
Dopo utilizziamo il metodo get_rect() dell’oggetto Surface, per ottenere un Rect con le stesse dimensioni della Surface. Questo ci permette di utilizzare in seguito il metodo collidepoint che ci serve per verificare se abbiamo cliccato l’immagine.
Generiamo le coordinate x e y con la funzione random per generare una posizione a caso del nostro fantasma di volta in volta.
Utilizziamo il metodo Clock e impostiamo il frame rate (FPS) a 1, ovvero il numero di frame al secondo. Dunque useremo il metodo tick() come ultima istruzione del ciclo principale.
Ecco dunque il codice completo:
import pygame, sys, random
pygame.init()
GREY=(108, 108, 108)
screen=pygame.display.set_mode((800, 600))
pygame.display.set_caption('Ghost')
screen.fill(GREY)
ghost=pygame.image.load('images/fantasma.png').convert_alpha()
p=ghost.get_rect()
x=random.randint(0,700)
y=random.randint(0,500)
p.x=x
p.y=y
screen.blit(ghost,p)
FPS=1
cl=pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
click = event.pos
if p.collidepoint(event.pos):
print("Hai cliccato l\'immagine")
else:
print ("Hai cliccato fuori")
screen.fill(GREY)
x=random.randint(0,700)
y=random.randint(0,500)
p.x=x
p.y=y
screen.blit(ghost,p)
pygame.display.update()
cl.tick(FPS)
Possiamo anche generare un sistema a punti, creando una variabile che si incrementa ogni volta che si clicca sul fantasma. Ad ogni clic sul fantasma incrementiamo anche l’FPS di 0.1, in modo da rendere il clic successivo più difficile.
Ecco quindi il codice modificato:
import pygame, sys, random
pygame.init()
GREY=(108, 108, 108)
screen=pygame.display.set_mode((800, 600))
pygame.display.set_caption('Ghost')
screen.fill(GREY)
ghost=pygame.image.load('images/fantasma.png').convert_alpha()
p=ghost.get_rect()
x=random.randint(0,700)
y=random.randint(0,500)
p.x=x
p.y=y
screen.blit(ghost,p)
punti=0
FPS=1
cl=pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
click = event.pos
if p.collidepoint(event.pos):
punti+=1
print(punti)
FPS+=0.1
screen.fill(GREY)
x=random.randint(0,700)
y=random.randint(0,500)
p.x=x
p.y=y
screen.blit(ghost,p)
pygame.display.update()
cl.tick(FPS)
Abbiamo realizzato questo semplice gioco ‘acchiappa il fantasma con pygame‘, nella prossima lezione vedremo come scrivere nella finestra, in modo da visualizzare il punteggio ottenuto.
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
da Cristina | Nov 3, 2019 | Pygame
In questa lezione utilizzeremo alcuni metodi dell’oggetto Rect, al fine di implementare qualche esempio.
In particolare vedremo i metodi move, move_ip e collidepoint.
Metodi dell’oggetto Rect – move_ip
In questo primo esempio utilizzeremo il metodo move_ip() per spostare il rettangolo creato utilizzando i tasti della tastiera, ad esempio K_UP, K_DOWN, K_LEFT, K_RIGHT.
Quindi quando clicchiamo su K_UP, sposteremo il rettangolo verso l’alto, cioè imposteremo ad esempio move_ip(0,-5) . In questo modo sposteremo solo la y di -5.
Invece quando clicchiamo su K_DOWN, sposteremo il rettangolo verso il basso, cioè imposteremo ad esempio move_ip(0,5) . In questo modo sposteremo solo la y di 5.
Poi, quando clicchiamo su K_LEFT, sposteremo il rettangolo verso sinistra, cioè imposteremo ad esempio move_ip(-5,0) . In questo modo sposteremo solo la x di -5.
Infine, quando clicchiamo su K_RIGHT, sposteremo il rettangolo verso destra, cioè imposteremo ad esempio move_ip(5,0) . In questo modo sposteremo solo la x di 5.
Ecco dunque un esempio completo:
import pygame, sys
from pygame.locals import *
pygame.init()
screen=pygame.display.set_mode((800, 600))
pygame.display.set_caption('Oggetto Rect')
CYAN=(0,255,255)
RED=(255,0,0)
r1=pygame.Rect(20,20,30,30)
s=pygame.Surface((30,30))
s.fill(RED)
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_UP:
r1.move_ip(0, -5)
elif event.key == pygame.K_DOWN:
r1.move_ip(0, 5)
elif event.key == pygame.K_LEFT:
r1.move_ip(-5, 0)
elif event.key == pygame.K_RIGHT:
r1.move_ip(5, 0)
screen.fill(CYAN)
screen.blit(s,r1)
pygame.display.update()
Move
Utilizziamo il metodo move() per spostare in maniera dinamica il nostro rettangolo rosso, di dimensione 30 x 30 pixel, al clic del mouse.
All’interno delle parentesi mettiamo le coordinate ottenute con il clic del mouse: event.pos.
Ecco quindi l’esempio completo:
import pygame, sys, random
pygame.init()
screen=pygame.display.set_mode((800, 600))
pygame.display.set_caption('Oggetto Rect')
CYAN=(0,255,255)
RED=(255,0,0)
w=30
l=30
r1=pygame.Rect(0,0,w,l)
s=pygame.Surface((w,l))
s.fill(RED)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
r1=pygame.Rect(0,0,w,l)
s=pygame.Surface((w,l))
s.fill(RED)
r1=r1.move(event.pos)
screen.fill(CYAN)
screen.blit(s,r1)
pygame.display.update()
Quindi, dopo aver avviato il programma, fate la prova a cliccare in un punto qualsiasi con il pulsante sinistro del mouse, vedrete che il rettangolo si sposterà nella nuova posizione.
Collidepoint
In questo secondo esempio utilizzeremo il metodo collidepoint per verificare se abbiamo fatto clic all’interno del rettangolo rosso.
L’attributo pos serve a determinare la posizione, cioè le coordinate x e y, del clic effettuato con il mouse. Infatti event.pos[0] mi restituisce la coordinata x, mentre event.pos[1] mi restituisce la y.
Ecco quindi l’esempio completo:
import pygame, sys
pygame.init()
screen=pygame.display.set_mode((800, 600))
pygame.display.set_caption('Oggetto Rect')
CYAN=(0,255,255)
RED=(255,0,0)
r1=pygame.Rect(20,20,30,30)
s=pygame.Surface((30,30))
s.fill(RED)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
click = event.pos
if r1.collidepoint(click):
print("Hai cliccato il quadrato rosso")
else:
print ("Hai cliccato fuori")
screen.fill(CYAN)
screen.blit(s,r1)
pygame.display.update()
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
da Cristina | Nov 3, 2019 | Pygame
In questa lezione studieremo l’oggetto Rect, un oggetto geometrico astratto caratterizzato dalla posizione e dalla lunghezza dei lati.
Per creare un Rect si utilizza il costruttore Rect():
pygame.Rect(x,y,w,h) – dove x e y sono le coordinate dell’angolo in alto a sinistra, mentre w ed h sono la larghezza e l’altezza del rettangolo
pygame.Rect((x,y),(w,h)) – i parametri hanno lo stesso significato dell’esempio sopra.
Quindi ad esempio:
pygame.Rect(0,0,250,120) – Avrò un rettangolo posizionato nel punto (0,0) di larghezza 250 pixel e altezza 120.
Attributi oggetto Rect
L’oggetto Rect ha tanti attributi che possono essere utilizzati per muovere o allineare il rettangolo.
Supponiamo quindi che r1=pygame.Rect(20,50,250,120):
.left o anche .x – Indica la x del lato sinistro. Allora r1.left=20.
.right – Indica la x del lato destro. Allora r1.right=270 cioè x che è uguale a 20 + la larghezza del rettangolo 250.
.top o anche .y – Indica la y del lato superiore. Dunque r1.top=50.
.topleft – Indica le coordinate dell’angolo in alto a sinistra. Quindi r1.topleft=(20,50).
.topright – Indica le coordinate dell’angolo in alto a destra. Allora r1.topright=(270,50).
.bottom – Indica la y del lato inferiore. Dunque r1.bottom=50.
.bottomleft – Indica le coordinate dell’angolo in basso a sinistra. Allora r1.bottomleft=(20,170).
.bottomright – Indica le coordinate dell’angolo in basso a destra. Dunque r1.bottomright=(270,170).
.center – Indica le coordinate del centro del rettangolo. Allora x sarà la metà di 250 più 20, cioè 145, mentre y sarà la metà di 120 più 50, cioè 110. Dunque r1.center=(145,110).
.centerx – Indica la coordinata x del centro del rettangolo. Quindi per quanto spiegato prima r1.centerx=145.
.centery – Indica la coordinata y del centro del rettangolo. Allora r1.centery=110.
.midtop – Indica le coordinate al centro del lato superiore. Allora r1.midtop=(145, 50).
.midbottom – Indica le coordinate al centro del lato inferiore. Quindi r1.midbottom=(145, 170).
.midleft – Indica le coordinate al centro del lato sinistro. Dunque r1.midleft=(20, 110).
.midright – Indica le coordinate al centro del lato destro. Allora r1.midright=(270, 110).
.size – Indica le dimensioni, cioè la larghezza e l’altezza del rettangolo. Quindi r1.size=(250,120).
.width – Indica la larghezza del rettangolo. Allora r1.width=250.
.left – Indica l’altezza del rettangolo. Quindi r1.height=120.
Chi vuole può anche consultare la guida completa al link: https://www.pygame.org/docs/ref/rect.html.
Esempio
Realizziamo un semplice programma che al clic del mouse mi restituisce i valori degli attributi di Rect.
Come detto Rect è un oggetto astratto, quindi abbiamo bisogno di un oggetto fisico come la Surface, che rappresenta la porzione di schermo sulla quale disegnare per visualizzare ad esempio un rettangolo.
Quindi: r1=pygame.Rect(20,50,250,120) è l’oggetto astratto.
Dopo utilizziamo s=pygame.Surface((250, 120)) e screen.blit(s,r1) per ottenere l’oggetto fisico.
Facciamo quindi un semplice esempio:
import pygame, sys
from pygame.locals import *
pygame.init()
screen=pygame.display.set_mode((800, 600))
pygame.display.set_caption('Oggetto Rect')
CYAN=(0,255,255)
RED=(255,0,0)
screen.fill(CYAN)
r1=pygame.Rect(20,50,250,120)
s=pygame.Surface((250, 120))
s.fill(RED)
screen.blit(s,r1)
pygame.display.flip()
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('x:', r1.left)
print('y:', r1.top)
print('midtop:', r1.midtop)
print('midbottom:', r1.midbottom)
print('midleft:', r1.midleft)
print('midright:', r1.midright)
print('right:', r1.right)
print('topleft:', r1.topleft)
print('topright:', r1.topright)
print('bottom:', r1.bottom)
print('bottomleft:', r1.bottomleft)
print('bottomright:', r1.bottomright)
print('center:', r1.center)
print('centerx:', r1.centerx)
print('centery:', r1.centery)
print('size:', r1.size)
print('width:', r1.width)
print('height:', r1.height)
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