Groupes
Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 17 sur 36.
Les sprites se déplacent en groupes : ennemis, lasers, pièces. Un Group contient de nombreux sprites et leur applique à tous la même opération :
enemies = pygame.sprite.Group()
for i in range(5):
enemies.add(Enemy(64 + i * 128, 60))Deux appels dans la boucle remplacent les boucles que tu écrivais sur une liste :
enemies.update()
enemies.draw(screen)enemies.update() appelle update() sur chaque sprite du groupe. enemies.draw(screen) blit le self.image de chaque sprite à son self.rect : c’est pourquoi ces deux noms doivent être exacts. Un sprite dans un groupe n’a pas besoin de sa propre méthode de dessin.
Un groupe connaît aussi sa taille, len(enemies), et tu peux parcourir ses éléments avec for enemy in enemies:. Dessine le groupe après le remplissage, comme n’importe quelle autre image.
Défi
Moyen- Remplacez
enemypar un groupe nomméenemiescontenant cinq sprites Enemy, centrés aux positions x = 64, 192, 320, 448 et 576, tous à y = 60. - Appelez
enemies.update()à chaque image. - Dessinez-les avec
enemies.draw(screen), après le remplissage.
Essayez vous-même
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Group")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
enemy_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
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 Enemy(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = enemy_image
self.rect = self.image.get_rect(center=(x, y))
def update(self):
self.rect.y += 3
if self.rect.top > 480:
self.rect.bottom = 0
player = Player()
enemy = Enemy(320, 60)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player.update()
enemy.update()
screen.fill((20, 22, 40))
screen.blit(enemy.image, enemy.rect)
screen.blit(player.image, player.rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
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