Menu
CoddyTech

Eliminar con kill()

Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 18 de 36.

Pulsa Espacio y la nave dispara: cada pulsación añade un sprite Laser al grupo lasers, y el contador de la esquina superior izquierda indica cuántos contiene el grupo. Dispara unas cuantas veces y observa cómo aumenta. Los láseres salen volando por la parte superior y no vuelven a verse, pero el grupo sigue conteniéndolos todos y sigue actualizándolos y dibujándolos. Tras unos minutos de juego, hay miles de láseres invisibles.

Un sprite que ha terminado se elimina con kill():

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

kill() saca al sprite de todos los grupos en los que está. Ya no se actualiza ni se dibuja, y Python libera su memoria cuando ninguna variable hace referencia a él. Comprueba bottom, no top: el láser se elimina cuando su último píxel ha salido de la ventana, nunca mientras todavía se vea una parte.

sprite.alive() es True mientras el sprite esté en al menos un grupo.

challenge icon

Desafío

Fácil

En Laser.update, después de moverlo, llama a self.kill() cuando rect.bottom del láser esté por encima de la parte superior de la ventana (menor que 0). El contador debería volver a 0 cuando todos los láseres hayan salido.

Pruébalo tú mismo

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

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame