Menu
CoddyTech

Bắt bằng spritecollide

Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 20 trên 39.

Tiền xu rơi xuống, còn con tàu phải hứng chúng. Một sprite va chạm với cả nhóm thì chỉ cần một lời gọi:

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

spritecollide(sprite, group, dokill) trả về một danh sách các sprite trong nhóm có rect chồng lên rect của sprite. Danh sách trống nếu không có gì chạm nhau, nên len(caught) là số tiền xu hứng được trong khung hình này.

Đối số thứ ba, dokill, xác định điều gì xảy ra với những sprite chạm nhau. True sẽ xóa chúng, giống như gọi kill() trên từng sprite, nên mỗi đồng xu chỉ được hứng một lần. Với False, chúng vẫn ở lại: phù hợp với kẻ địch mà bạn chỉ va phải, nhưng không phù hợp với tiền xu, vì chúng sẽ cộng thêm một điểm ở mỗi khung hình khi chồng lên con tàu.

Kiểm tra va chạm trong phần cập nhật của vòng lặp, sau khi các sprite đã di chuyển.

challenge icon

Thử thách

Trung bình

Để người chơi bắt xu.

  1. Sau coins.update(), dùng pygame.sprite.spritecollide để thu thập những đồng xu chạm vào người chơi và xóa chúng.
  2. Cộng số xu đã bắt được vào score. Phần code ban đầu đã hiển thị điểm số.

Nhấn Chơi và bắt một đồng xu: dòng Score: 1 sẽ xuất hiện. Sau đó nhấn Kiểm tra.

Tự làm thử

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()

Tất cả bài học trong Sprite và hình ảnh

Tự luyện tập: Playground Pygame