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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الكائنات والصور

تدرّب بنفسك: Playground لـ Pygame