Menu
CoddyTech

Ölü Parçacıkları Kaldır

Coddy'nin Pygame Journey'sinin Ses ve Oyun Hissi bölümünün bir parçası. Ders 11 / 23.

Ölü bir parçacık çizilmez, ancak yine de listede bulunur. Döngü her karede onu hareket ettirir ve ömrünü yeniden azaltır. 100 kez tıklayın; listede kimsenin göremediği 2000 parçacık birikir ve oyun giderek yavaşlar. Üstteki sayaç bunu gösterir.

Ölü parçacıkları her karede, güncellemeden sonra bir kez kaldırın. En anlaşılır yöntem, hâlâ canlı olan parçacıklardan yeni bir liste oluşturmaktır:

particles = [p for p in particles if p["life"] > 0]

Bu şu anlama gelir: ömrü 0'dan büyük olan her p için particles içindeki öğelerden oluşan liste.

Aynı liste üzerinde çalışan bir for döngüsü sırasında listeden öğe kaldırmayın:

for p in particles:
    if p["life"] <= 0:
        particles.remove(p)

Bir öğe kaldırıldığında, sonraki öğe onun yerine geçer ve döngü ona bakmadan atlar. Burada bir patlamadaki her parçacık aynı karede ölür, bu yüzden her seferinde yarısı geride kalır. Yeni bir liste oluşturmak hiçbir şeyi atlamaz.

challenge icon

Görev

Orta

Her tıklama, 30 kare boyunca yaşayan 20 parçacık oluşturur ve sayaç hiçbir zaman azalmaz. Güncelleme döngüsünden sonra particles listesini yalnızca life değeri 0'dan büyük olan parçacıkları içerecek şekilde değiştir; böylece bir patlama sona erdiğinde sayaç Particles: 0 değerini gösterir.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Ses ve Oyun Hissi bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground