Menu
CoddyTech

Rimuovere con kill()

Fa parte della sezione Sprite e immagini del percorso Pygame di Coddy. Lezione 18 di 36.

Premi Spazio e la nave spara: ogni pressione aggiunge uno sprite Laser al gruppo lasers e il contatore in alto a sinistra indica quanti ne contiene il gruppo. Spara qualche colpo e guarda il contatore aumentare. I laser volano fuori dalla parte superiore e non si vedono più, ma il gruppo li contiene ancora tutti e continua ad aggiornarli e disegnarli. Dopo qualche minuto di gioco, sono migliaia di laser invisibili.

Uno sprite che ha terminato il suo compito si rimuove con kill():

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

kill() rimuove lo sprite da tutti i gruppi di cui fa parte. Non viene più aggiornato né disegnato, e Python lo libera quando nessuna variabile vi fa più riferimento. Controlla bottom, non top: il laser scompare quando il suo ultimo pixel ha lasciato la finestra, mai mentre una sua parte è ancora visibile.

sprite.alive() è True mentre uno sprite si trova in almeno un gruppo.

challenge icon

Sfida

Facile

In Laser.update, dopo averlo spostato, chiama self.kill() quando rect.bottom del laser si trova sopra il bordo superiore della finestra (minore di 0). Il contatore dovrebbe tornare a 0 quando tutti i laser sono usciti.

Provalo tu

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

Tutte le lezioni di Sprite e immagini

Esercitati da solo: Playground Pygame