Hapus Partikel yang Mati
Termasuk bagian Suara dan Sensasi Bermain dalam perjalanan Pygame di Coddy. Pelajaran 11 dari 23.
Partikel yang mati tidak digambar, tetapi masih ada di dalam list. Setiap frame, loop menggerakkannya dan mengurangi masa hidupnya lagi. Klik 100 kali, dan list akan berisi 2000 partikel yang tidak bisa dilihat siapa pun, lalu game akan semakin lambat. Penghitung di bagian atas menunjukkannya.
Hapus partikel yang mati sekali setiap frame, setelah pembaruan. Cara paling jelas adalah membuat list baru yang berisi partikel yang masih hidup:
particles = [p for p in particles if p["life"] > 0]Artinya: list berisi setiap p di dalam particles yang masa hidupnya lebih dari 0.
Jangan hapus item dari list saat for loop berjalan pada list yang sama:
for p in particles:
if p["life"] <= 0:
particles.remove(p)Saat sebuah item dihapus, item berikutnya berpindah ke tempatnya, dan loop melewatinya tanpa memeriksanya. Di sini, setiap partikel dalam satu ledakan mati pada frame yang sama, jadi setengahnya tertinggal setiap kali. Membuat list baru tidak akan melewatkan apa pun.
Tantangan
SedangSetiap klik membuat 20 partikel yang bertahan selama 30 frame, dan penghitungnya tidak pernah berkurang. Setelah perulangan pembaruan, ganti particles dengan list yang hanya berisi partikel dengan life di atas 0, agar penghitung menunjukkan Particles: 0 setelah ledakan selesai.
Coba sendiri
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()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Suara dan Sensasi Bermain
4Guncangan Layar dan Kilatan Saat Terkena Serangan
Guncangan LayarKilatan Saat Terkena SeranganJeda BenturanJangan Berlebihan6Sempurnakan Patroli Bintang
Suara Patroli BintangPercikan di Setiap BenturanLatihan sendiri: Playground Pygame