المجموعات
جزء من قسم الكائنات والصور في رحلة 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:. ارسم المجموعة بعد التعبئة، مثل أي صورة أخرى.
التحدي
متوسط- استبدل
enemyبمجموعة باسمenemiesتحتوي على خمس كائنات Enemy، متمركزة عند x = 64 و192 و320 و448 و576، جميعها عند y = 60. - استدعِ
enemies.update()في كل إطار. - ارسمها باستخدام
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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الكائنات والصور
4الكائنات الرسومية والمجموعات
صنف Spriteالمجموعاتالإزالة باستخدام kill()الالتقاط باستخدام spritecollideمجموعة ضد مجموعة2دوّر واقلب وغيّر الحجم
التدوير حول المركزوجّهها في اتجاه الطيرانغيّر حجم الصورةدوّر انطلاقًا من الصورة الأصلية5تصادمات مثالية على مستوى البكسل
المستطيلات تبدو غير منصفةالأقنعةكائنات Sprite مثالية على مستوى البكسلمناطق التصادم الدائرية6التحريك باستخدام أوراق الرسوم المتحركة
قصّ ورقة الرسوم المتحركةعداد الإطاراتالتحريك باستخدام الوقتانفجار لمرة واحدةتدرّب بنفسك: Playground لـ Pygame