Menu
CoddyTech

spritecollide로 잡기

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

동전이 비처럼 쏟아지고, 배는 동전을 받아야 합니다. 스프라이트 하나와 스프라이트 그룹 전체를 비교하는 데는 호출 한 번이면 됩니다.

caught = pygame.sprite.spritecollide(player, coins, True)
score += len(caught)

spritecollide(sprite, group, dokill)은 그룹 안에서 rect가 해당 스프라이트의 rect와 겹치는 스프라이트 목록을 반환합니다. 아무것도 닿지 않으면 목록은 비어 있으므로, len(caught)는 이번 프레임에 잡은 동전의 개수입니다.

세 번째 인수인 dokill은 닿은 스프라이트에 어떤 일이 일어날지 지정합니다. True이면 각 스프라이트에 kill()을 호출한 것과 같이 스프라이트를 제거하므로, 동전은 한 번만 잡힙니다. False이면 스프라이트가 남습니다. 한 번 부딪히기만 하는 적에게는 적절하지만, 배와 겹치는 매 프레임마다 점수를 추가하게 되는 동전에는 적절하지 않습니다.

스프라이트를 이동시킨 다음, 반복문의 업데이트 부분에서 충돌을 검사하세요.

challenge icon

챌린지

중급
  1. coins.update() 다음에 pygame.sprite.spritecollide를 사용해 플레이어와 닿은 코인을 수집하고 제거하세요.
  2. 잡은 코인의 수를 score에 더하세요. 시작 코드는 이미 Score: 와 점수를 표시합니다.

직접 해보기

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Coin Catcher")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
coin_image = pygame.image.load("assets/images/coin.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 Coin(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = coin_image
        self.rect = self.image.get_rect(center=(random.randint(20, 620), random.randint(-400, -20)))

    def update(self):
        self.rect.y += 2
        if self.rect.top > 480:
            self.rect.center = (random.randint(20, 620), -20)


player = Player()
coins = pygame.sprite.Group()
for i in range(6):
    coins.add(Coin())
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()
    coins.update()

    screen.fill((20, 22, 40))
    coins.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 플레이그라운드