Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Laser.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

Kendi başına pratik yap: Pygame playground