Menu
CoddyTech

مجموعة ضد مجموعة

جزء من قسم الكائنات والصور في رحلة Pygame على Coddy. الدرس 20 من 36.

ينبغي أن تدمّر أشعة الليزر الأعداء. هذه مجموعة في مواجهة مجموعة: أي شعاع ليزر في مواجهة أي عدو. تختبر groupcollide كل زوج دفعة واحدة:

hits = pygame.sprite.groupcollide(enemies, lasers, True, True)
score += len(hits)

قيمتا True هما علامتا dokill، واحدة لكل مجموعة: الأولى تزيل الأعداء الذين أُصيبوا، والثانية تزيل أشعة الليزر التي أصابتهم. قد يتمكن شعاع ليزر يواصل التحليق بعد الإصابة من القضاء على عدو ثانٍ فوق العدو الأول.

hits هو قاموس: كل عدو أُصيب هو مفتاح، وقيمته قائمة بأشعة الليزر التي أصابته. تمثّل len(hits) عدد الأعداء الذين أُصيبوا في هذا الإطار، حتى عندما يصيب شعاعا ليزر العدو نفسه.

يحدّد ترتيب المجموعتين ما ستكون عليه المفاتيح. عند استخدام groupcollide(lasers, enemies, True, True) ستكون المفاتيح أشعة الليزر، وستعدّ len(hits) أشعة الليزر بدلاً من ذلك.

challenge icon

التحدي

متوسط
  1. بعد التحديثات، اختبر enemies مقابل lasers باستخدام pygame.sprite.groupcollide، مع إزالة كلٍّ من العدو والليزر.
  2. أضف عدد الأعداء الذين تم إصابتهم إلى score.

جرّب بنفسك

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Laser Hits")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
enemy_image = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
laser_image = pygame.image.load("assets/images/laser.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 Enemy(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = enemy_image
        self.rect = self.image.get_rect(center=(x, y))

    def update(self):
        self.rect.y += 1
        if self.rect.top > 480:
            self.rect.bottom = 0


class Laser(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = laser_image
        self.rect = self.image.get_rect(midbottom=(x, y))

    def update(self):
        self.rect.y -= 10
        if self.rect.bottom < 0:
            self.kill()


player = Player()
lasers = pygame.sprite.Group()
enemies = pygame.sprite.Group()
for i in range(5):
    enemies.add(Enemy(64 + i * 128, 60))
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            lasers.add(Laser(player.rect.centerx, player.rect.top))

    player.update()
    lasers.update()
    enemies.update()

    screen.fill((20, 22, 40))
    enemies.draw(screen)
    lasers.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