Menu
CoddyTech

תפיסה באמצעות spritecollide

חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 19 מתוך 36.

מטבעות יורדים מהשמיים, והספינה צריכה לתפוס אותם. זיהוי התנגשות בין ספרייט אחד לקבוצה שלמה מתבצע בקריאה אחת:

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

spritecollide(sprite, group, dokill) מחזירה רשימה של הספרייטים בקבוצה שה-rect שלהם חופף ל-rect של הספרייט. הרשימה ריקה כששום דבר לא נוגע, ולכן len(caught) הוא מספר המטבעות שנתפסו בפריים הזה.

הארגומנט השלישי, dokill, קובע מה קורה לספרייטים שנוגעים זה בזה. True מסיר אותם, ממש כמו קריאה ל-kill() על כל אחד מהם, כך שאפשר לתפוס מטבע רק פעם אחת. עם False הם נשארים: מתאים לאויב שרק מתנגשים בו, אבל לא למטבע, שהיה מוסיף נקודה בכל פריים שבו הוא חופף לספינה.

בצעו את הבדיקה בחלק העדכון של הלולאה, אחרי שהספרייטים זזו.

challenge icon

אתגר

בינוני
  1. אחרי coins.update(), אספו את המטבעות שנוגעים בשחקן באמצעות pygame.sprite.spritecollide, תוך הסרתם מהמשחק.
  2. הוסיפו את מספר המטבעות שנתפסו ל־score. קוד הפתיחה כבר מציג Score: ואת הניקוד.

נסו בעצמכם

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 iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה ספרייטים ותמונות

תרגלו בעצמכם: Pygame אונליין