Sito web di notizie tecnologiche e videogames.

Pygame Shooter Parte 4: Proiettili & Shooting

12

Questo articolo è la quarta parte del progetto PyShooter, oggi vedremo come far sparare il nostro player e come rilevare le collisioni tra i proiettili e i nemici.

La classe Bullet

Il proiettile (bullet) sarà uno sprite che verrà spawnato quando l’utente spara, si posizionerà in cima al nostro player sprite e si muoverà sull’asse delle y verso il bordo superiore della finestra ad una certa velocità.

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10, 20))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedy = -10
    def update(self):
        self.rect.y += self.speedy
        # kill if it moves off the top of the screen
        if self.rect.bottom < 0:
            self.kill()

Dato che il player è dotato di movimento al metodo __init__() si passano anche la x e la y del proiettile, ovvero la posizione del player nel momento dello sparo. La velocità del proiettile è negativa in quanto vogliamo che esso si diriga verso la parte superiore della finestra. Infine controlliamo che quando esce dalla finestra il proiettile venga rimosso.

Input da tastiera

Per fare in modo che un proiettile venga generato ogni volta che l’utente prima la barra spaziatrice aggiungere il seguente codice al gestore degli eventi del game loop:

for event in pygame.event.get():
    # check for closing window
    if event.type == pygame.QUIT:
        running = False
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE:
            player.shoot()

Generare i proiettili

Per prima cosa abbiamo bisogno di un nuovo gruppo che contenga tutti i nostri proiettili:

        bullets = pygame.sprite.Group()

Ora aggiungiamo la funzione seguente alla classe Player:

def shoot(self):
    bullet = Bullet(self.rect.centerx, self.rect.top)
    all_sprites.add(bullet)
    bullets.add(bullet)

Come è possibile notare quando si istanzia un oggetto bullet vengono passate la x e la y del player, in modo da far spawnare il bullet nella posizione corretta. Collisioni dei proiettiliL’ultimo passo è quello di controllare quando un proiettile collide con un mob. A differenza di quanto visto nell’ultimo articolo dove tramite la funzione spritecollide() rilevavamo le collisioni tra un gruppo ed un singolo oggetto, in questo caso dobbiamo confrontare due gruppi di sprite tra di loro, ovvero bullets e mobs.Per fare questo useremo la funzione groupcollide():

hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
for hit in hits:
    m = Mob()
    all_sprites.add(m)
    mobs.add(m)

Dato che una volta che il proiettile colpisce un mob esso viene eliminato dobbiamo assicurarci di non rimanere a corto di mobs! Per questo nell’istruzione precedente ogni volta che eliminiamo un mob ne creiamo un altro.

Nel prossimo articolo vedremo come aggiungere un po’ di grafica al nostro videogioco!

Pygame Shooter Parte 4: Proiettili & Shooting

Link al codice: code

Link al precedente articolo: Pygame Shooter Parte 3: Gestire le collisioni

 

Commenti