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