Menu
CoddyTech

Supprimer avec kill()

Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 18 sur 36.

Appuie sur Espace et le vaisseau tire : chaque pression ajoute un sprite Laser au groupe lasers, et le compteur en haut à gauche indique combien le groupe en contient. Tire quelques fois et regarde le compteur augmenter. Les lasers quittent l’écran par le haut et ne réapparaissent jamais, mais le groupe les contient toujours tous et continue de les mettre à jour et de les dessiner. Après quelques minutes de jeu, cela représente des milliers de lasers invisibles.

Un sprite qui a terminé se supprime avec kill() :

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

kill() retire le sprite de tous les groupes auxquels il appartient. Il n’est alors plus mis à jour ni dessiné, et Python le libère dès qu’aucune variable ne le référence. Teste bottom, pas top : le laser disparaît lorsque son dernier pixel a quitté la fenêtre, jamais tant qu’une partie est encore visible.

sprite.alive() vaut True tant qu’un sprite appartient à au moins un groupe.

challenge icon

Défi

Facile

Dans Laser.update, après le déplacement, appelle self.kill() lorsque rect.bottom du laser se trouve au-dessus du haut de la fenêtre (inférieur à 0). Le compteur doit revenir à 0 dès que tous les lasers ont quitté l’écran.

Essayez vous-même

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

Toutes les leçons de Sprites et images

Entraînez-vous par vous-même : Playground Pygame