Menu
CoddyTech

Gruppo contro gruppo

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

I laser dovrebbero distruggere i nemici. Si tratta di un gruppo contro un gruppo: qualsiasi laser contro qualsiasi nemico. groupcollide verifica ogni coppia contemporaneamente:

hits = pygame.sprite.groupcollide(enemies, lasers, True, True)
score += len(hits)

I due True sono i flag dokill, uno per gruppo: il primo elimina i nemici colpiti, il secondo i laser che li hanno colpiti. Un laser che continua a volare dopo un colpo potrebbe eliminare un secondo nemico sopra il primo.

hits è un dizionario: ogni nemico colpito è una chiave e il suo valore è l'elenco dei laser che lo hanno colpito. len(hits) è il numero di nemici colpiti in questo fotogramma, anche quando due laser colpiscono lo stesso nemico.

L'ordine dei gruppi determina quali sono le chiavi. Con groupcollide(lasers, enemies, True, True), le chiavi sarebbero i laser e len(hits) conterebbe i laser.

challenge icon

Sfida

Medio
  1. Dopo gli aggiornamenti, verifica le collisioni tra enemies e lasers con pygame.sprite.groupcollide, eliminando sia il nemico sia il laser.
  2. Aggiungi a score il numero di nemici colpiti.

Provalo tu

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()
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Sprite e immagini

Esercitati da solo: Playground Pygame