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.
Thử thách
Trung bìnhĐể người chơi bắt xu.
- Sau
coins.update(), dùngpygame.sprite.spritecollideđể thu thập những đồng xu chạm vào người chơi và xóa chúng. - 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
5Va chạm chính xác đến từng pixel
Hình chữ nhật thật bất côngMặt nạSprite chính xác đến từng pixelVùng va chạm hình tròn3Lớp cho đối tượng trong trò chơi
Lớp đầu tiên của bạnPhương thứcSelf là đối tượngDanh sách đối tượngĐối tượng có hình ảnhDanh sách kẻ địchLớp con6Hoạt ảnh từ sprite sheet
Cắt sprite sheetBộ đếm khung hìnhTạo hoạt ảnh theo thời gianHiệu ứng nổ chỉ chạy một lầnTự luyện tập: Playground Pygame