Rimuovere le particelle inattive
Fa parte della sezione Suoni e sensazioni di gioco del percorso Pygame di Coddy. Lezione 11 di 23.
Una particella morta non viene disegnata, ma è ancora nell’elenco. A ogni fotogramma il ciclo la sposta e riduce ancora la sua durata. Fai clic 100 volte e nell’elenco ci sono 2000 particelle che nessuno può vedere, e il gioco diventa sempre più lento. Il contatore in alto lo mostra.
Rimuovi quelle morte una volta per fotogramma, dopo l’aggiornamento. Il modo più chiaro consiste nel creare un nuovo elenco delle particelle ancora vive:
particles = [p for p in particles if p["life"] > 0]Questo significa: l’elenco di ogni p in particles la cui durata è superiore a 0.
Non rimuovere elementi da un elenco mentre un ciclo for scorre lo stesso elenco:
for p in particles:
if p["life"] <= 0:
particles.remove(p)Quando un elemento viene rimosso, quello successivo prende il suo posto e il ciclo lo salta senza esaminarlo. Qui tutte le particelle di un’esplosione muoiono nello stesso fotogramma, quindi ogni volta ne rimane indietro la metà. Creando un nuovo elenco non si salta mai nulla.
Sfida
MedioOgni clic crea 20 particelle che vivono per 30 fotogrammi, e il contatore non diminuisce mai. Dopo il ciclo di aggiornamento, sostituisci particles con un elenco contenente solo le particelle la cui life è maggiore di 0, così il contatore indica Particles: 0 quando un’esplosione è terminata.
Provalo tu
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Fireworks")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 28)
particles = []
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
for i in range(20):
particles.append({
"x": x,
"y": y,
"vx": random.uniform(-3, 3),
"vy": random.uniform(-3, 3),
"life": 30,
})
for p in particles:
p["x"] += p["vx"]
p["y"] += p["vy"]
p["life"] -= 1
screen.fill((20, 20, 36))
for p in particles:
if p["life"] > 0:
pygame.draw.circle(screen, (255, 160, 60), (p["x"], p["y"]), 3)
label = font.render(f"Particles: {len(particles)}", True, (240, 240, 240))
screen.blit(label, (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 Suoni e sensazioni di gioco
1Effetti sonori
Caricare un suonoSuono al verificarsi di un eventoVolume del suonoSuoni e tasti tenuti premuti4Scuotimento dello schermo e flash all’impatto
Scuotimento dello schermoFlash all’impattoPausa all’impattoMantienilo discreto3Particelle
Una particellaUn'esplosione di particelleDissolvenza e rimpicciolimentoRimuovere le particelle inattive6Perfezionare Star Patrol
Suoni di Star PatrolScintille a ogni colpoEsercitati da solo: Playground Pygame