Menu
CoddyTech

المجموعات

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

تأتي الكائنات الرسومية بأعداد كبيرة: أعداء وأشعة ليزر وعملات. تحتوي المجموعة على العديد من الكائنات الرسومية، وتنفّذ الإجراء نفسه عليها جميعًا:

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

يحلّ استدعاءان داخل الحلقة محل الحلقات التي كتبتها للتكرار على قائمة:

enemies.update()
enemies.draw(screen)

يستدعي enemies.update() الدالة update() على كل كائن رسومي في المجموعة. يرسم enemies.draw(screen) صورة كل كائن رسومي، self.image، عند موضعه self.rect: ولهذا يجب أن يكون هذان الاسمان مطابقين تمامًا. لا يحتاج الكائن الرسومي في المجموعة إلى دالة رسم خاصة به.

تعرف المجموعة أيضًا حجمها، len(enemies)، ويمكنك التكرار عليها باستخدام for enemy in enemies:. ارسم المجموعة بعد التعبئة، مثل أي صورة أخرى.

challenge icon

التحدي

متوسط
  1. استبدل enemy بمجموعة باسم enemies تحتوي على خمس كائنات Enemy، متمركزة عند x = 64 و192 و320 و448 و576، جميعها عند y = 60.
  2. استدعِ enemies.update() في كل إطار.
  3. ارسمها باستخدام enemies.draw(screen)، بعد التعبئة.

جرّب بنفسك

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Group")
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()


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 += 3
        if self.rect.top > 480:
            self.rect.bottom = 0


player = Player()
enemy = Enemy(320, 60)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    player.update()
    enemy.update()

    screen.fill((20, 22, 40))
    screen.blit(enemy.image, enemy.rect)
    screen.blit(player.image, player.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconاختبر نفسك

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

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

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