Menu
CoddyTech

Wykrywanie kolizji za pomocą spritecollide

Część sekcji Sprite’y i obrazy ścieżki Pygame w Coddy. Lekcja 19 z 36.

Monety spadają, a statek powinien je łapać. Jeden duszek kontra cała grupa — wystarczy jedno wywołanie:

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

spritecollide(sprite, group, dokill) zwraca listę duszków z grupy, których rect nachodzi na rect duszka. Gdy nic się nie styka, lista jest pusta, więc len(caught) to liczba monet złapanych w tej klatce.

Trzeci argument, dokill, określa, co się dzieje z duszkami, które się stykają. True usuwa je, tak samo jak wywołanie kill() dla każdego z nich, więc monetę można złapać tylko raz. Przy wartości False pozostają na miejscu: to dobre rozwiązanie dla wroga, na którego tylko wpadasz, ale złe dla monety, która dodawałaby punkt w każdej klatce, w której nachodzi na statek.

Wykonaj test w części pętli odpowiedzialnej za aktualizację, po przesunięciu duszków.

challenge icon

Wyzwanie

Średni
  1. Po coins.update() zbierz monety dotykające gracza za pomocą pygame.sprite.spritecollide, usuwając je.
  2. Dodaj liczbę złapanych monet do score. Kod początkowy już wyświetla Score: i wynik.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Sprite’y i obrazy

Poćwicz samodzielnie: Edytor online Pygame