Menu
CoddyTech

Esplosioni

Fa parte della sezione Sprite e immagini del percorso Pygame di Coddy. Lezione 34 di 36.

Un nemico che scompare in un solo frame dà l’impressione che non sia successo nulla. Metti un’esplosione nel punto in cui si trovava: l’animazione a riproduzione singola del capitolo 6, come sprite nel suo gruppo.

for enemy in hits:
    score += 10
    explosions.add(Explosion(enemy.rect.center))

Uno sprite eliminato ha ancora il suo Rect, quindi enemy.rect.center indica il punto in cui è stato colpito. L’esplosione riproduce explosion_1.png fino a explosion_4.png, 5 frame ciascuna, poi si elimina.

Carica le quattro immagini in una lista, explosion_frames, prima del ciclo. Aggiorna explosions a ogni frame e disegnalo per ultimo, sopra tutto il resto, così l’esplosione copre la nave e i laser con cui si sovrappone.

I suoni, lo schermo tremolante e le scintille volanti arrivano nella sezione 6, sviluppati partendo da questo stesso ciclo.

challenge icon

Sfida

Medio
  1. Carica explosion_1.png fino a explosion_4.png nell’elenco explosion_frames.
  2. Scrivi la classe Explosion della lezione Un’esplosione in un solo colpo, creata con un center.
  3. Crea explosions = pygame.sprite.Group(); aggiungi un’esplosione al centro di ogni nemico distrutto; aggiornala a ogni fotogramma e disegnala dopo l’astronave.

Provalo tu

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Star Patrol")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
red_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = ship_image
        self.rect = self.image.get_rect(midbottom=(320, 470))

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 6
        if keys[pygame.K_RIGHT]:
            self.rect.x += 6
        self.rect.clamp_ip(screen.get_rect())


class Laser(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = laser_image
        self.rect = self.image.get_rect(midbottom=(x, y))
        self.mask = pygame.mask.from_surface(self.image)

    def update(self):
        self.rect.y -= 10
        if self.rect.bottom < 0:
            self.kill()


class Enemy(pygame.sprite.Sprite):
    def __init__(self, image, x, y, speed):
        super().__init__()
        self.image = image
        self.rect = self.image.get_rect(center=(x, y))
        self.mask = pygame.mask.from_surface(self.image)
        self.speed = speed

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


def spawn_wave(image, count, speed):
    for i in range(count):
        x = random.randint(40, 600)
        enemies.add(Enemy(image, x, -40 - i * 120, speed))


player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
last_shot = 0
score = 0
spawn_wave(red_image, 6, 2)

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

    player.update()
    keys = pygame.key.get_pressed()
    now = pygame.time.get_ticks()
    if keys[pygame.K_SPACE] and now - last_shot >= 250:
        lasers.add(Laser(player.rect.centerx, player.rect.top))
        last_shot = now
    lasers.update()
    enemies.update()
    for enemy in enemies:
        if enemy.rect.top > 480:
            enemy.kill()
    hits = pygame.sprite.groupcollide(enemies, lasers, True, True, pygame.sprite.collide_mask)
    for enemy in hits:
        score += 10

    screen.fill((12, 14, 30))
    enemies.draw(screen)
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Sprite e immagini

Esercitati da solo: Playground Pygame