Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

Setiap 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()
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Suara dan Sensasi Bermain

Latihan sendiri: Playground Pygame