Tote Partikel entfernen
Teil des Abschnitts Sound und Spielgefühl der Pygame-Journey von Coddy. Lektion 11 von 23.
Ein totes Partikel wird nicht gezeichnet, ist aber noch in der Liste. In jedem Frame bewegt die Schleife es und verringert erneut seine Lebensdauer. Klicke 100-mal, und die Liste enthält 2000 Partikel, die niemand sehen kann, und das Spiel wird immer langsamer. Der Zähler oben zeigt es an.
Entferne die toten Partikel einmal pro Frame, nach der Aktualisierung. Am übersichtlichsten ist es, eine neue Liste mit den Partikeln zu erstellen, die noch leben:
particles = [p for p in particles if p["life"] > 0]Das bedeutet: die Liste aller p in particles, deren Lebensdauer größer als 0 ist.
Entferne keine Elemente aus einer Liste, während eine for-Schleife dieselbe Liste durchläuft:
for p in particles:
if p["life"] <= 0:
particles.remove(p)Wenn ein Element entfernt wird, rückt das nächste an seine Stelle, und die Schleife überspringt es, ohne es anzusehen. Hier stirbt jedes Partikel eines Ausbruchs im selben Frame, sodass jedes Mal die Hälfte zurückbleibt. Beim Erstellen einer neuen Liste wird nichts übersprungen.
Aufgabe
MittelJeder Klick erzeugt 20 Partikel, die 30 Frames lang leben, und der Zähler geht nie zurück. Ersetze nach der Aktualisierungsschleife particles durch eine Liste, die nur die Partikel enthält, deren life größer als 0 ist, damit der Zähler Particles: 0 anzeigt, sobald ein Feuerwerk vorbei ist.
Probier es selbst
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()
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Sound und Spielgefühl
6Star Patrol aufpolieren
Star-Patrol-SoundsFunken bei jedem TrefferÜbe selbstständig: Pygame-Playground