Aggiungiamo un bonus per movimentare un po’ il gioco.
Per non dimenticare nulla, ho aggiunto un bonus che casualmente compare nella schermata dei giocatori, e in questo caso, se colpito dalla palla, allarga il pad del giocatore che lo ha colpito fino alla fine partita. Ecco il codice che ho creato per tale funzionalità.
Per prima cosa, all’inizio del codice, ho aggiunto il suono di impatto della palla con il “bonus” con il seguente codice.
#suono allungamento paddle
hit_paddle_allungamento = pygame.mixer.Sound('bonus2.wav')
La seconda riga di codice crea un oggetto Sound che carica e contiene il suono del file multimediale “bonus2.wav” e lo assegna alla variabile “hit_paddle_allungamento“.
Successivamente, vi è una parte del codice in cui si configurano alcune caratteristiche del bonus, come il font, la rotazione e via dicendo.
# Cambia la dimensione del font come preferisci
bonus_font = pygame.font.SysFont(None, 40)
# Cambia il colore come preferisci
bonus_text = bonus_font.render('BONUS', True, (255, 255, 255))
bonus_text_width, bonus_text_height = bonus_text.get_size()
bonus_pos = pygame.Rect(random.randint(100, width - 100), random.randint(100, height - 100), bonus_text_width, bonus_text_height)
# Angolo di rotazione iniziale
angle = 0
bonus_active = True
La prima riga, quella dopo il primo commento crea un oggetto font che può essere usato per scrivere il testo sullo schermo. Il font viene impostato usando un font di sistema predefinito (dato che il primo argomento è None) con una dimensione di 40 pixel.
La seconda riga quella che inizia con “bonus_text” crea un’immagine del testo che rappresenta la parola “BONUS”. Il secondo argomento, “True”, abilita l’antialiasing del testo, rendendolo più leggibile. Il terzo argomento è una tupla di valori che rappresenta il colore del testo in formato RGB (rosso, verde, blu), e in questo caso la tupla seguente (255, 255, 255) è il colore bianco.
Nella riga successiva, con l’aiuto del comando “bonus_text.get_size()” si ottengono le dimensioni dell’immagine del testo e il codice le assegna alle variabili “bonus_text_width” e “bonus_text_height“.
Per la riga della variabile “bonus_pos” è un po’ più complessa la spiegazione. Questa riga definisce un rettangolo (pygame.Rect) che determina la posizione del testo del bonus sullo schermo. Le posizioni x e y del rettangolo sono scelte casualmente, con l’uso di random.randint per garantire che il bonus appaia all’interno dei confini della finestra di gioco (determinati dalle variabili width e height), ma non troppo vicino ai bordi (dato che sia x che y sono compresi tra 100 e width – 100 o height – 100). Le dimensioni del rettangolo sono quelle del testo del bonus.
Infine, le ultime due righe impostano il valore zero alla variabile “angle” corrispondente all’angolo di rotazione iniziale della scritta bonus, e alla variabile “bonus_active” il valore “True” attivando la funzionalità “bonus”.
Continuando con l’implementazione della funzionalità per la gestione del “bonus”, all’interno del ciclo while principale aggiungeremo le seguenti righe di codice per la rappresentazione del bonus, la gestione della collisione della palla con la scritta “bonus” e l’allungamento del paddle e dell’ultimo giocatore che ha colpito la palla.
while running:
clock.tick(60)
#Altro codice....
if bonus_active:
# Ruotare il Testo
angle += 1
# Aumenta l'angolo ad ogni frame
rotated_bonus_text = pygame.transform.rotate(bonus_text, angle)
rect = rotated_bonus_text.get_rect(center=bonus_pos.center)
screen.blit(rotated_bonus_text, rect.topleft)
if bonus_active and ball_pos.colliderect(bonus_pos):
print('la palla ha colpito il bonus')
if last_hit is not None:
if last_hit == "left":
print('raddopia il paddle left')
left_paddle_pos.height = 120
paddle_color_left = (255,0,0)
hit_paddle_allungamento.play()
else:
print('raddoppia il paddle right')
right_paddle_pos.height = 120
paddle_color_right = (255,0,0)
hit_paddle_allungamento.play()
bonus_active = False
Partiamo dal primo “if” o dalla prima sezione di codice che spiega la rotazione della scritta “bonus”. In questa riga si controlla se la variabile bonus_active è True. Questa variabile tiene traccia del fatto se la funzionalità “bonus” è attiva o no nel gioco. Se la variabile bonus_active è True, il codice all’interno del blocco if verrà eseguito.
Successivamente, la variabile angle viene incrementata di uno. Questo significa che ad ogni “frame” (ogni volta che il blocco di codice viene eseguito, che presumibilmente è molte volte al secondo) l’angolo viene aumentato di un grado. Tutto ciò, è utilizzato per creare un effetto di rotazione.
La riga successiva chiama la funzione rotate() del modulo transform di Pygame. La funzione ruota il testo dato (bonus_text) dell’angolo specificato (angle). Il risultato è una nuovo oggetto di superficie (rotated_bonus_text) che ha il testo ruotato.
La riga successiva crea un nuovo rettangolo (rect) che ha le stesse dimensioni dell’immagine ruotata (rotated_bonus_text). Il metodo get_rect() può essere usato per ottenere un rettangolo con la dimensione esatta dell’immagine ruotata, che è utile per posizionare l’immagine su schermo. Il rettangolo è posizionato in modo che il suo centro sia lo stesso centro del rettangolo specificato da bonus_pos.center. Questo significa che il testo ruotato verrà posizionato in modo che il suo centro sia allineato con il centro del “bonus”.
Infine, il testo ruotato viene disegnato sullo schermo. La funzione blit() è un metodo fondamentale in Pygame che disegna una immagine su un’altra. In questo caso, rotated_bonus_text è l’immagine da disegnare, e rect.topleft specifica la posizione superiore sinistra dove iniziare a disegnare l’immagine. Il risultato è che il testo ruotato viene disegnato sullo schermo nell’area specificata.
Ora, passiamo alla seconda parte di codice che gestisce la collisione della palla con la scritta “bonus” e l’allungamento del paddle dell’ultimo giocatore che ha colpito la palla. Dal secondo “if”, Il codice controlla se due condizioni sono vere: se il “bonus” è attivo e se c’è stata una collisione tra la palla (ball_pos) e la posizione del bonus (bonus_pos). In particolare, il codice seguente ball_pos.colliderect(bonus_pos) utilizza il metodo colliderect per verificare se il rettangolo associato alla posizione della palla (ball_pos) interseca (cioè collide con) il rettangolo della posizione del bonus (bonus_pos).
Il successivo “if” prosegue con il codice se la variabile “last_hit” è valorizzata con il valore “left” o “right”. Tale valore indica quale giocatore ha colpito per ultimo la palla, se quello di sinistra o quello di destra.
Se la variabile “last_hit” è valorizzata ed è “left” allora significa che il giocatore di sinistra ha colpito la palla per ultimo e verrà quindi eseguito il codice che imposta l’altezza del paddle sinistro (left_paddle_pos.height) a 120, che lo allunga, dando un vantaggio temporaneo al giocatore di sinistra e cambia il colore del paddle sinistro (paddle_color_left) in rosso, con un valore RGB di (255, 0, 0). In tutto questo viene eseguito l’oggetto sonoro “hit_paddle_allungamento“, che riproduce un suono per indicare che il paddle è stato raddoppiato. Con l’else si ripete il codice per il giocatore di destra.
Infine, si disabilità la funzionalità di “bonus” attribuendo alla variabile “bonus_active” il valore “False“. Nel corso di una partita comparirà un bonus soltanto.