Menu
CoddyTech

Usuwanie za pomocą kill()

Część sekcji Sprite’y i obrazy ścieżki Pygame w Coddy. Lekcja 18 z 36.

Naciśnij spację, a statek wystrzeli: każde naciśnięcie dodaje duszka lasera do grupy lasers, a licznik w lewym górnym rogu pokazuje, ile ich jest w grupie. Wystrzel kilka i obserwuj, jak rośnie. Lasery wylatują górą i nigdy więcej ich nie widać, ale grupa nadal przechowuje każdy z nich, wciąż aktualizuje je wszystkie i rysuje. Po kilku minutach gry są to tysiące niewidocznych laserów.

Duszek, który zakończył działanie, usuwa się za pomocą kill():

def update(self):
    self.rect.y -= 10
    if self.rect.bottom < 0:
        self.kill()

kill() usuwa duszka ze wszystkich grup, do których należy. Nie jest już aktualizowany ani rysowany, a Python zwalnia zajmowaną przez niego pamięć, gdy żadna zmienna się do niego nie odwołuje. Sprawdzaj bottom, a nie top: laser znika, gdy jego ostatni piksel opuści okno, nigdy zaś wtedy, gdy choć jego część jest jeszcze widoczna.

sprite.alive() ma wartość True, gdy duszek należy do co najmniej jednej grupy.

challenge icon

Wyzwanie

Łatwy

W metodzie Laser.update, po przesunięciu wywołaj self.kill(), gdy rect.bottom lasera znajduje się powyżej górnej krawędzi okna (mniej niż 0). Licznik powinien wrócić do 0, gdy wszystkie lasery opuszczą okno.

Spróbuj swoich sił

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()

Wszystkie lekcje w sekcji Sprite’y i obrazy

Poćwicz samodzielnie: Edytor online Pygame