Implementazione della fisica di base e del rilevamento delle collisioni in Pygame

Implementazione della fisica di base e del rilevamento delle collisioni in Pygame

Pygame fornisce diverse funzioni integrate per rilevare collisioni tra oggetti di gioco. Questi sono inestimabili perché capire esattamente quando e come gli oggetti in movimento si sovrappongono può essere un compito complicato.

Scopri come aggiungere la fisica di base e le collisioni nel tuo gioco usando il modulo pygame.

Funzioni integrate di rilevamento delle collisioni di Pygame

La funzione di rilevamento delle collisioni incorporata più basilare è spritecollide. Prende uno sprite, un gruppo di sprite e un valore booleano che indica se gli sprite devono o meno “morire” (essere rimossi) quando entrano in collisione. Questa funzione restituisce un elenco di sprite che si sono scontrati. Ecco un esempio di come usarlo:

collided_sprites = pygame.sprite.spritecollide(sprite1, sprite_group, True)

Un’altra utile funzione di rilevamento delle collisioni è groupcollide, che accetta anche due gruppi di sprite e un valore booleano. Questa funzione restituisce un dizionario con gli sprite in collisione come chiavi e gli sprite con cui si sono scontrati come valori. Ecco un esempio di come usarlo:

collision_dict = pygame.sprite.groupcollide(group1, group2, True, True)

Creazione di un gioco platform di base utilizzando la funzione spritecolline

Per creare un gioco platform di base utilizzando Pygame, dovrai creare uno sprite del giocatore che l’utente possa controllare e uno sprite della piattaforma su cui il giocatore possa stare in piedi. Puoi utilizzare la funzione spritecollide per rilevare quando lo sprite del giocatore si scontra con lo sprite della piattaforma e impedire al giocatore di cadere attraverso la piattaforma.

Per iniziare, installa il modulo pygame usando pip:

pip install pygame

Successivamente, crea classi semplici per Player e Platform, entrambe dovrebbero ereditare dalla classe Sprite di Pygame. La classe Player dovrebbe avere un metodo di aggiornamento per gestire la posizione del giocatore in base alla velocità. Inoltre, dovrebbe avere una variabile y_velocity per applicare l’effetto gravità. La classe Platform dovrebbe avere un metodo __init__ che prende le coordinate della piattaforma e crea una superficie con quella dimensione.

Classe giocatore

Puoi creare una classe Player usando il modulo pygame.sprite.Sprite. Questa classe inizializzerà il giocatore con una data coordinata x e y. Quindi, il metodo di aggiornamento aggiornerà la posizione del giocatore incrementando il valore y_velocity.

import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.rect = self.image.get_rect(topleft=(x, y))
        self.y_velocity = 0


    def update(self):
        self.rect.y += self.y_velocity

Classe piattaforma

La classe Platform utilizza anche il modulo pygame.sprite.Sprite. Questa classe inizializzerà la piattaforma con le coordinate x e y fornite, nonché una larghezza e un’altezza.

class Platform(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height):
        super().__init__()
        self.image = pygame.Surface((width, height))
        self.rect = self.image.get_rect(topleft=(x, y))

Il ciclo di gioco

Il ciclo di gioco ti permetterà di creare una finestra con una dimensione di 640×480. Quindi, eseguirà un ciclo che verificherà eventuali eventi, come un comando quit. Verificherà anche eventuali collisioni tra il giocatore e la piattaforma. Infine, riempirà lo schermo con un colore bianco, disegnerà il giocatore e la piattaforma, quindi capovolgerà il display.

player = Player(100, 300)
player_group = pygame.sprite.Group()
player_group.add(player)

platform = Platform(50, 400, 100, 20)
platform_group = pygame.sprite.Group()
platform_group.add(platform)

# Initialize pygame and create window
pygame.init()
screen = pygame.display.set_mode((640, 480))

# Main game loop
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player_group.update()
    collided = pygame.sprite.spritecollide(player, platform_group, False)

    if collided:
        player.y_velocity = 0
    screen.fill((255, 255, 255))
    player_group.draw(screen)
    platform_group.draw(screen)
    pygame.display.flip()

pygame.quit()

Di seguito è riportato l’output:

semplice gioco platform con pygame

Implementazione della gravità e del comportamento di salto

Per implementare la gravità e il comportamento di salto nel tuo gioco platform, dovrai aggiungere velocità y allo sprite del tuo giocatore e aggiornare la sua posizione y in ogni fotogramma. Per fare ciò puoi utilizzare il metodo update all’interno della classe Player e aggiungere il seguente snippet di codice:

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.rect = self.image.get_rect(topleft=(x, y))
        self.y_velocity = 0

    def update(self):
        self.rect.y += self.y_velocity
        self.y_velocity += GRAVITY # Apply gravity to y velocity

Ora ogni volta che chiami il metodo di aggiornamento, aggiornerà la posizione del giocatore in base alla sua velocità e gravità.

Per far saltare lo sprite del giocatore, puoi associare l’azione di salto a un tasto o pulsante specifico e aggiornare la velocità y del giocatore con un valore negativo. Il seguente frammento di codice è un esempio di come saltare quando un giocatore preme la barra spaziatrice.

JUMP_VELOCITY = -10

# inside the game loop
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
    player.y_velocity = JUMP_VELOCITY

Nota che dovrai controllare event.type per assicurarti che l’evento sia un evento KEYDOWN prima di controllare il valore della chiave.

Aggiunta di fisica di base come attrito e accelerazione

Per aggiungere fisica di base come l’attrito e l’accelerazione al tuo gioco platform, dovrai aggiornare la velocità x dello sprite del tuo giocatore in ogni fotogramma. Puoi aggiungere la velocità x alla classe del giocatore e aggiornarla allo stesso modo della velocità y. Per implementare l’attrito, puoi diminuire la velocità x dello sprite del giocatore di una piccola quantità in ogni fotogramma. Ad esempio, puoi aggiungere il seguente frammento di codice all’interno del metodo update della classe Player:

FRICTION = 0.9

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((32, 32))
        self.rect = self.image.get_rect(topleft=(x, y))
        self.y_velocity = 0
        self.x_velocity = 0


    def update(self):
        self.rect.y += self.y_velocity
        self.rect.x += self.x_velocity
        self.y_velocity += GRAVITY # Apply gravity to y velocity
        self.x_velocity *= FRICTION # Apply friction to x velocity

Per implementare l’accelerazione, puoi impostare una variabile, player_movement, per il movimento orizzontale, e aggiornare la velocità x dello sprite del giocatore in base al valore player_movement. Puoi farlo associando il movimento a tasti o pulsanti specifici e aggiornando la velocità x del giocatore nel ciclo degli eventi, ad esempio:

ACCELERATION = 0.5
player_movement = 0

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
        player_movement = -1
    elif event.key == pygame.K_RIGHT:
        player_movement = 1
elif event.type == pygame.KEYUP:
    if event.key in (pygame.K_LEFT, pygame.K_RIGHT):
        player_movement = 0


player.x_velocity += player_movement * ACCELERATION

Utilizzando queste tecniche, puoi creare un gioco platform semplice ma divertente utilizzando le funzioni di rilevamento delle collisioni integrate di Pygame e la fisica di base. Con un po’ di creatività e sperimentazione, puoi utilizzare queste tecniche per creare una varietà di giochi e meccaniche di gioco differenti.

Puoi trovare il codice completo nel repository GitHub.

Di seguito è riportato l’output:

semplice gioco platform con gravità e accelerazione

Migliora il coinvolgimento degli utenti con le collisioni

Molti giochi richiedono una qualche forma di rilevamento delle collisioni. Puoi utilizzare le collisioni per creare un’ampia gamma di meccaniche di gioco, da semplici platform a complesse simulazioni basate sulla fisica.

L’implementazione della fisica di base come la gravità, l’attrito e l’accelerazione può anche migliorare notevolmente il coinvolgimento dell’utente, aggiungendo realismo e un senso di peso agli oggetti di gioco.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *