תפיסה באמצעות 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 הם נשארים: מתאים לאויב שרק מתנגשים בו, אבל לא למטבע, שהיה מוסיף נקודה בכל פריים שבו הוא חופף לספינה.
בצעו את הבדיקה בחלק העדכון של הלולאה, אחרי שהספרייטים זזו.
אתגר
בינוני- אחרי
coins.update(), אספו את המטבעות שנוגעים בשחקן באמצעותpygame.sprite.spritecollide, תוך הסרתם מהמשחק. - הוסיפו את מספר המטבעות שנתפסו ל־
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()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ספרייטים ותמונות
5התנגשויות מדויקות ברמת הפיקסל
מלבנים מרגישים לא הוגניםמסכותספרייטים מדויקים ברמת הפיקסלתיבות פגיעה מעגליות3מחלקות לאובייקטים במשחק
המחלקה הראשונה שלךמתודותself הוא האובייקטרשימה של אובייקטיםאובייקטים עם תמונותתת־מחלקהתרגלו בעצמכם: Pygame אונליין