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.
Desafío
FácilEn 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
1Cargar imágenes
Cargar una imagenColocarla con un rectánguloMover la imagenRepetir un fondo en mosaicoPíxeles transparentes4Sprites y grupos
La clase SpriteGruposEliminar con kill()Detectar colisiones con spritecollideGrupo contra grupo2Girar, voltear y escalar
Girar alrededor del centroApuntar en la dirección del vueloEscalar una imagenGirar desde la imagen original5Colisiones precisas a nivel de píxel
Los rectángulos parecen injustosMáscarasSprites precisos a nivel de píxelHitboxes circulares3Clases para objetos del juego
Tu primera claseMétodosSelf es el objetoUna lista de objetosObjetos con imágenesUna subclase6Animación con hojas de sprites
Recortar una hoja de spritesUn contador de fotogramasAnimar con el tiempoUna explosión de una sola vezPractica por tu cuenta: Playground de Pygame