Menu
CoddyTech

Grupo contra grupo

Parte de la sección Sprites e imágenes del Journey de Pygame de Coddy. Lección 20 de 36.

Los láseres deberían destruir a los enemigos. Es un grupo contra otro: cualquier láser contra cualquier enemigo. groupcollide comprueba cada pareja a la vez:

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

Los dos True son las opciones dokill, una por grupo: la primera elimina a los enemigos alcanzados; la segunda, los láseres que los alcanzaron. Un láser que siga volando después de un impacto podría eliminar a un segundo enemigo situado por encima del primero.

hits es un diccionario: cada enemigo alcanzado es una clave, y su valor es la lista de láseres que lo alcanzaron. len(hits) es el número de enemigos alcanzados en este fotograma, incluso cuando dos láseres alcanzan al mismo enemigo.

El orden de los grupos determina cuáles son las claves. Con groupcollide(lasers, enemies, True, True), las claves serían los láseres y len(hits) contaría los láseres.

challenge icon

Desafío

Intermedio
  1. Después de las actualizaciones, comprueba las colisiones entre enemies y lasers con pygame.sprite.groupcollide, eliminando tanto al enemigo como al láser.
  2. Añade a score el número de enemigos alcanzados.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Sprites e imágenes

Practica por tu cuenta: Playground de Pygame