الالتقاط باستخدام 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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الكائنات والصور
4الكائنات الرسومية والمجموعات
صنف Spriteالمجموعاتالإزالة باستخدام kill()الالتقاط باستخدام spritecollideمجموعة ضد مجموعة2دوّر واقلب وغيّر الحجم
التدوير حول المركزوجّهها في اتجاه الطيرانغيّر حجم الصورةدوّر انطلاقًا من الصورة الأصلية5تصادمات مثالية على مستوى البكسل
المستطيلات تبدو غير منصفةالأقنعةكائنات Sprite مثالية على مستوى البكسلمناطق التصادم الدائرية6التحريك باستخدام أوراق الرسوم المتحركة
قصّ ورقة الرسوم المتحركةعداد الإطاراتالتحريك باستخدام الوقتانفجار لمرة واحدةتدرّب بنفسك: Playground لـ Pygame