Sito web di notizie tecnologiche e videogames.

Pygame Shooter Parte 6: Migliorare le collisioni

13

Questo articolo è la sesta parte del progetto PyShooter, oggi vedremo come migliorare il sistema di collisioni del nostro videogame.

Il sistema di collisione attuale

Nello scorso articolo abbiamo aggiunto delle immagini agli sprites che prima erano dei semplici rettangoli, facendo ciò può capitare che il gioco rilevi una collisione tra il player ed una meteora anche quando essi non abbiano ancora colliso.

Per capire meglio il perché osserviamo la seguente immagine:

Pygame Shooter Parte 6: Migliorare le collisioni

Fino ad adesso abbiamo usato la funzione collide_rect() che utilizza le coordinate dei rettangoli che vengono ricavati dalle immagini degli sprite per rilevare le collisioni.

Un metodo per ovviare questo problema è utilizzare la funzione collide_rect_ratio() che permette di settare una dimensione più piccola del rettangolo.

Pygame Shooter Parte 6: Migliorare le collisioni

Un altro metodo per ovviare il problema è di racchiudere lo sprite invece che in una “scatola” rettangolare in una circolare. Pygame, come al solito, offre un metodo semplice e veloce per fare questo.

Per vedere graficamente il cerchio in cui lo sprite è racchiuso e decidere quindi se aumentarne o diminuirne il raggio aggiungiamo le seguenti righe nelle funzioni __init__() degli sprites.

Per la classe Sprite:

self.rect = self.image.get_rect()       
self.radius = 20       
pygame.draw.circle(self.image, RED, self.rect.center, self.radius) 

Per la classe Mob:

self.rect = self.image.get_rect()       
self.radius = int(self.rect.width / 2)       
pygame.draw.circle(self.image, RED, self.rect.center, self.radius) 

NB: la variabile self.radius indica il valore del raggio del cerchio

Pygame Shooter Parte 6: Migliorare le collisioni

Cambiare il metodo di rilevazione di collisione

Per fare in modo che il videogioco rilevi le collisioni in funzione dei cerchi che contengono gli sprites dobbiamo modificare la seguente riga nel game loop:

hits = pygame.sprite.spritecollide(player, mobs, False, pygame.sprite.collide_circle) 

Una volta che è stato trovato il giusto valore del raggio per il cerchio che racchiude la navicella e per quello che racchiude le meteora si possono tranquillamente commentare le linee che disegnano il cerchio graficamente.

Conclusione

La gestione delle collisioni è un aspetto fondamentale all’interno di un videogioco, per questo è importante curarla il più possibile. Con un sistema di collisioni efficiente l’esperienza di gioco è sicuramente migliore.

Nel prossimo articolo vedremo come aggiungere qualche animazione agli sprite del videogioco.

Link al codice: code

Link al precedente articolo: Pygame Shooter Parte 5: Aggiungere la grafica

 

Commenti