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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה ספרייטים ותמונות

תרגלו בעצמכם: Pygame אונליין