Supprimer les particules mortes
Fait partie de la section Son et sensations de jeu du Journey Pygame de Coddy. Leçon 11 sur 23.
Une particule morte n’est pas dessinée, mais elle figure toujours dans la liste. À chaque image, la boucle la déplace et diminue encore sa durée de vie. Cliquez 100 fois et la liste contient 2000 particules que personne ne peut voir, et le jeu ralentit de plus en plus. Le compteur en haut le montre.
Supprimez les particules mortes une fois par image, après la mise à jour. La méthode la plus claire consiste à créer une nouvelle liste contenant les particules qui sont encore en vie :
particles = [p for p in particles if p["life"] > 0]Cela signifie : la liste de chaque p dans particles dont la durée de vie est supérieure à 0.
Ne supprimez pas d’éléments d’une liste pendant qu’une boucle for parcourt cette même liste :
for p in particles:
if p["life"] <= 0:
particles.remove(p)Lorsqu’un élément est supprimé, le suivant prend sa place, et la boucle passe au-delà sans le vérifier. Ici, toutes les particules d’une explosion meurent dans la même image, donc la moitié d’entre elles restent à chaque fois. Créer une nouvelle liste ne fait jamais rien sauter.
Défi
MoyenChaque clic crée 20 particules qui vivent pendant 30 images, et le compteur ne diminue jamais. Après la boucle de mise à jour, remplace particles par une liste contenant uniquement les particules dont life est supérieur à 0, afin que le compteur affiche Particles: 0 une fois l’explosion terminée.
Essayez vous-même
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()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Son et sensations de jeu
4Tremblement de l’écran et flash d’impact
Tremblement de l’écranFlash d’impactArrêt sur impactRester subtil3Particules
Une particuleUne explosion de particulesFondu et rétrécissementSupprimer les particules mortesEntraînez-vous par vous-même : Playground Pygame