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.
Défi
FacileDans 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
1Charger des images
Charger une imageLa placer avec un rectangleDéplacer l’imageRépéter un arrière-planPixels transparents4Sprites et groupes
La classe SpriteGroupesSupprimer avec kill()Détecter avec spritecollideUn groupe contre un autre2Tourner, retourner, redimensionner
Faire pivoter autour du centreRegarder dans la direction du volRedimensionner une imagePivoter à partir de l’original5Collisions au pixel près
Les rectangles semblent injustesMasquesSprites au pixel prèsZones de collision circulaires3Les classes pour les objets du jeu
Votre première classeLes méthodesSelf est l’objetUne liste d’objetsDes objets avec des imagesUne sous-classe6Animation à partir de feuilles de sprites
Découper une feuille de spritesUn compteur de framesAnimer avec le tempsUne explosion à déclenchement uniqueEntraînez-vous par vous-même : Playground Pygame