Sito web di notizie tecnologiche e videogames.

Pygame Shooter Parte 12: Le vite del player

5

Questo articolo è la dodicesima parte del progetto PyShooter, oggi vedremo come sviluppare il sistema di vite per il nostro player.

Esplosione del player

Per rendere il gioco più interessante carichiamo un set di immagini diverse al momento dell’esplosione del player.

Per fare ciò dobbiamo solamente aggiungere una lista che contenga le immagini da associare all’esplosione del player, aggiungiamo quindi le seguenti righe nel medesimo modo dello scorso articolo.

explosion_anim['player'] = []
for i in range(9):
        filename = 'sonicExplosion0{}.png'.format(i)   
                     img = pygame.image.load(path.join(img_dir, filename)).convert()   
                     img.set_colorkey(BLACK)   
                     explosion_anim['player'].append(img)

A questo punto dobbiamo fare in modo che quando il valore di shield diventa minore di 0 venga creata un’esplosione. Aggiungiamo quindi le seguenti righe nel ciclo for che scorre la lista di collisioni (hits) tra i mob ed il player:

        if player.shield <= 0:
               death_explosion = Explosion(player.rect.center, 'player')
               all_sprites.add(death_explosion)
                player.kill()
if not player.alive() and not death_explosion.alive():
        running = False

NB: settiamo il valore di running a False solamente quando il player è stato eliminato e la sua esplosione è terminata, in modo da non chiudere il gioco prima del dovuto.

Le vite

Per tenere traccia delle vite del player useremo una variabile e successivamente la visualizzeremo sullo schermo. Per indicare sul display quante vite sono rimaste useremo delle immagini più piccole del player.

Creiamo quindi l’immagine ridotta del player:

player_img = pygame.image.load(path.join(img_dir, "player.png")).convert()
player_mini_img = pygame.transform.scale(player_img, (25, 19))
player_mini_img.set_colorkey(BLACK)

Ora aggiungiamo nel metodo __init__() della classe Player qualche attributo:

  •      un contatore delle vite
  •      un flag (variabile booleana) per mostrare/nascondere il player
  •      un timer per controllare per quanto tempo il player è rimasto  nascosto
self.lives = 3
self.hidden = False
self.hide_timer = pygame.time.get_ticks()

A questo punto quando il player muore, invece di usare la funzione kill(), nascondiamo il player, sottraiamo 1 dal contatore delle vite e resettiamo il valore di shield per la prossima vita.

        player.hide()
   player.lives -= 1
   player.shield = 100

Definiamo quidi il metodo hide() nella classe Player in modo che setti la variabile hidden a True, faccia partire il timer e sposti il player fuori dalla finestra in modo che non possa essere colpito dalle meteore.

def hide(self):
    # hide the player temporarily
    self.hidden = True
    self.hide_timer = pygame.time.get_ticks()
    self.rect.center = (WIDTH / 2, HEIGHT + 200)

Nel metodo update della classe Player facciamo in modo che passato un certo periodo di tempo (1 secondo) il valore della variabile hidden torni a False in modo che il player torni visibile

def update(self):
        # unhide if hidden
        if self.hidden and pygame.time.get_ticks() - self.hide_timer > 1000:
            self.hidden = False
            self.rect.centerx = WIDTH / 2
            self.rect.bottom = HEIGHT - 10

Renderizzazione delle vite

Al fine di disegnare le vite sullo schermo creiamo la funzione draw_shield_bar() che disegna l’immagine del player per quante sono le vite del player:

def draw_lives(surf, x, y, lives, img):
    for i in range(lives):
        img_rect = img.get_rect()
        img_rect.x = x + 30 * i
        img_rect.y = y
        surf.blit(img, img_rect)

Richiamiamo quindi la nostra funzione nel game loop:

draw_lives(screen, WIDTH – 100, 5, player.lives, player_mini_img)

Pygame Shooter Parte 12: Le vite del player

Link al codice ed alle immagini: code, images

Link al precedente articolo: Pygame Shooter Parte 11: Esplosioni

 

Commenti