Menu
CoddyTech

그룹 대 그룹

Coddy Pygame 여정의 스프라이트와 이미지 섹션에 포함된 레슨. 36개 중 20번째.

레이저는 적을 파괴해야 합니다. 이는 그룹 대 그룹의 충돌입니다. 어떤 레이저든 어떤 적과든 충돌할 수 있습니다. groupcollide는 모든 쌍을 한 번에 검사합니다.

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

두 개의 True는 각 그룹에 하나씩 지정하는 dokill 플래그입니다. 첫 번째는 맞은 적을 제거하고, 두 번째는 적을 맞힌 레이저를 제거합니다. 명중한 뒤에도 계속 날아가는 레이저는 첫 번째 적 위에 있는 두 번째 적도 제거할 수 있습니다.

hits는 딕셔너리입니다. 맞은 적 각각이 키이고, 그 값은 해당 적을 맞힌 레이저의 목록입니다. 같은 적을 두 레이저가 맞힌 경우에도 len(hits)는 이번 프레임에 맞은 적의 수입니다.

그룹의 순서에 따라 어떤 항목이 키가 될지 결정됩니다. groupcollide(lasers, enemies, True, True)를 사용하면 키는 레이저가 되고, len(hits)는 레이저의 수를 셉니다.

challenge icon

챌린지

중급
  1. 업데이트 후 pygame.sprite.groupcollide를 사용해 enemies와 lasers를 충돌 검사하고, 적과 레이저를 모두 제거합니다.
  2. 맞은 적의 수를 score에 더합니다.

직접 해보기

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 icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

스프라이트와 이미지의 모든 레슨

직접 연습해 보세요: Pygame 플레이그라운드