Menu
CoddyTech

Tangkap dengan spritecollide

Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 19 dari 36.

Koin berjatuhan, dan kapal harus menangkapnya. Satu sprite melawan seluruh grup cukup dengan satu pemanggilan:

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

spritecollide(sprite, group, dokill) mengembalikan daftar sprite dalam grup yang rect-nya bertumpang tindih dengan rect sprite tersebut. Daftar akan kosong jika tidak ada yang bersentuhan, jadi len(caught) adalah jumlah yang tertangkap pada frame ini.

Argumen ketiga, dokill, menentukan apa yang terjadi pada sprite yang bersentuhan. True menghapusnya, sama seperti memanggil kill() pada masing-masing sprite, sehingga koin hanya tertangkap sekali. Dengan False, sprite tetap ada: cocok untuk musuh yang hanya kamu tabrak, tetapi tidak cocok untuk koin, karena koin akan menambah satu poin setiap frame saat bertumpang tindih dengan kapal.

Lakukan pengujian di bagian update perulangan, setelah sprite bergerak.

challenge icon

Tantangan

Sedang
  1. Setelah coins.update(), kumpulkan koin yang menyentuh pemain dengan pygame.sprite.spritecollide, lalu hapus koin tersebut.
  2. Tambahkan jumlah koin yang tertangkap ke score. Kode awal sudah menampilkan Score: dan skor.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Sprite dan Gambar

Latihan sendiri: Playground Pygame