Menu
CoddyTech

spritecollide ile Yakalama

Coddy'nin Pygame Journey'sinin Sprite'lar ve Görseller bölümünün bir parçası. Ders 19 / 36.

Madeni paralar yağar ve gemi onları yakalamalıdır. Bir grup dolusu nesneye karşı tek bir hareketli nesne için tek bir çağrı yeterlidir:

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

spritecollide(sprite, group, dokill), grupta rect alanı hareketli nesnenin rect alanıyla çakışan hareketli nesnelerin listesini döndürür. Hiçbir şey temas etmediğinde liste boştur; dolayısıyla len(caught), bu karede yakalananların sayısıdır.

Üçüncü bağımsız değişken olan dokill, temas edenlere ne olacağını belirler. True onları yok eder; her birinde kill() çağırmakla aynıdır, böylece bir madeni para yalnızca bir kez yakalanır. False ise oldukları yerde kalırlar: Yalnızca çarpıp geçeceğiniz bir düşman için doğru, gemiyle çakıştığı her karede bir puan ekleyecek bir madeni para için yanlıştır.

Testi, hareketli nesneler hareket ettikten sonra döngünün güncelleme bölümünde yapın.

challenge icon

Görev

Orta
  1. coins.update() sonrasında, pygame.sprite.spritecollide ile oyuncuya dokunan paraları toplayıp yok edin.
  2. Yakalananların sayısını score'a ekleyin. Başlangıç kodu zaten Score: metnini ve skoru gösteriyor.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Sprite'lar ve Görseller bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground