Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Ogni 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()
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 Suoni e sensazioni di gioco

Esercitati da solo: Playground Pygame