Un groupe contre un autre
Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 20 sur 36.
Les lasers doivent détruire les ennemis. Il s’agit d’un groupe contre un groupe : chaque laser contre chaque ennemi. groupcollide teste chaque paire à la fois :
hits = pygame.sprite.groupcollide(enemies, lasers, True, True)
score += len(hits)Les deux True sont les indicateurs dokill, un par groupe : le premier détruit les ennemis touchés, le second les lasers qui les ont touchés. Un laser qui continue à voler après un impact pourrait éliminer un deuxième ennemi situé au-dessus du premier.
hits est un dictionnaire : chaque ennemi touché est une clé, et sa valeur est la liste des lasers qui l’ont touché. len(hits) correspond au nombre d’ennemis touchés pendant cette image, même lorsque deux lasers touchent le même ennemi.
L’ordre des groupes détermine les clés. Avec groupcollide(lasers, enemies, True, True), les clés seraient des lasers, et len(hits) compterait donc les lasers.
Défi
Moyen- Après les mises à jour, vérifie les collisions entre
enemiesetlasersavecpygame.sprite.groupcollide, en supprimant à la fois l’ennemi et le laser. - Ajoute à
scorele nombre d’ennemis touchés.
Essayez vous-même
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Laser Hits")
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()
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 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 += 1
if self.rect.top > 480:
self.rect.bottom = 0
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
if self.rect.bottom < 0:
self.kill()
player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
for i in range(5):
enemies.add(Enemy(64 + i * 128, 60))
score = 0
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()
enemies.update()
screen.fill((20, 22, 40))
enemies.draw(screen)
lasers.draw(screen)
screen.blit(player.image, player.rect)
text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(text, (10, 10))
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