Ö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.
Görev
OrtaHer 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()
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
4Ekran Sarsıntısı ve Darbe Parlaması
Ekran SarsıntısıDarbe ParlamasıDarbe DurdurmasıAbartıdan Kaçının6Yıldız Devriyesini Geliştir
Yıldız Devriyesi SesleriHer Vuruşta KıvılcımlarKendi başına pratik yap: Pygame playground