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.
Sfida
Medio- Carica
explosion_1.pngfino aexplosion_4.pngnell’elencoexplosion_frames. - Scrivi la classe
Explosiondella lezione Un’esplosione in un solo colpo, creata con uncenter. - 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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Sprite e immagini
1Caricare immagini
Caricare un'immaginePosizionarla con un rettangoloSpostare l'immagineRipetere uno sfondoPixel trasparenti4Sprite e gruppi
La classe SpriteGruppiRimuovere con kill()Catturare con spritecollideGruppo contro gruppo7La pattuglia stellare
La nave di pattugliaSpara con i laser2Ruota, capovolgi, ridimensiona
Ruotare attorno al centroRivolgiti nella direzione in cui voliRidimensionare un'immagineRuotare dall'originale3Classi per gli oggetti del gioco
La tua prima classeMetodiSelf è l’oggettoUna lista di oggettiOggetti con immaginiUna sottoclasse6Animazione con gli sprite sheet
Ritagliare uno sprite sheetUn contatore di frameAnimare con il tempoUn’esplosione a riproduzione singolaEsercitati da solo: Playground Pygame