kill() ile Kaldırma
Coddy'nin Pygame Journey'sinin Sprite'lar ve Görseller bölümünün bir parçası. Ders 18 / 36.
Boşluk tuşuna basınca gemi ateş eder: her basış lasers grubuna bir Laser sprite'ı ekler ve sol üstteki sayaç, grupta kaç tane olduğunu gösterir. Birkaç kez ateş et ve sayının yükselişini izle. Lazerler ekranın üstünden uçar gider ve bir daha görünmez, ancak grup hepsini tutmaya devam eder; ayrıca hepsini güncellemeyi ve çizmeyi sürdürür. Birkaç dakikalık oyunun ardından binlerce görünmez lazer olur.
İşi biten bir sprite, kendisini kill() ile kaldırır:
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()kill(), sprite'ı içinde bulunduğu tüm gruplardan çıkarır. Artık güncellenmez veya çizilmez ve hiçbir değişken ona başvurmadığında Python belleğini serbest bırakır. top yerine bottom değerini kontrol et: lazer, son pikseli pencereden çıktıktan sonra gider; bir kısmı hâlâ görünürken değil.
sprite.alive(), bir sprite en az bir grupta bulunduğu sürece True değerini verir.
Görev
KolayLaser.update içinde, hareket ettikten sonra lazerin rect.bottom değeri pencerenin üst kenarının üzerindeyse (0'dan küçükse) self.kill() çağır. Her lazer ekrandan çıktıktan sonra sayaç tekrar 0'a düşmelidir.
Kendin dene
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Lasers")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.png").convert_alpha()
font = pygame.font.Font(None, 32)
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = ship_image
self.rect = self.image.get_rect(midbottom=(320, 470))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= 6
if keys[pygame.K_RIGHT]:
self.rect.x += 6
self.rect.clamp_ip(screen.get_rect())
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = laser_image
self.rect = self.image.get_rect(midbottom=(x, y))
def update(self):
self.rect.y -= 10
player = Player()
lasers = pygame.sprite.Group()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
lasers.add(Laser(player.rect.centerx, player.rect.top))
player.update()
lasers.update()
screen.fill((20, 22, 40))
lasers.draw(screen)
screen.blit(player.image, player.rect)
count = font.render(f"Lasers: {len(lasers)}", True, (240, 240, 240))
screen.blit(count, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Sprite'lar ve Görseller bölümündeki tüm dersler
4Sprite'lar ve Gruplar
Sprite SınıfıGruplarkill() ile Kaldırmaspritecollide ile YakalamaGruba Karşı Grup2Döndür, Yansıt, Ölçekle
Merkez Etrafında DöndürUçtuğun Yöne DönBir Görseli ÖlçekleOrijinalinden Döndür5Piksel Hassasiyetinde Çarpışmalar
Dikdörtgenler Haksız HissettiriyorMaskelerPiksel Hassasiyetinde Sprite'larDaire Hitbox'ları3Oyun Nesneleri için Sınıflar
İlk SınıfınızMetotlarSelf Nesnenin KendisidirNesneler ListesiGörselli NesnelerBir Alt Sınıf6Sprite Sheet'lerden Animasyon
Bir Sprite Sheet'i KesmekBir Kare SayacıZamanla AnimasyonTek Seferlik Bir PatlamaKendi başına pratik yap: Pygame playground