Menu
CoddyTech

הסרה באמצעות kill()

חלק מהיחידה ספרייטים ותמונות במסלול ה-Pygame של Coddy. שיעור 18 מתוך 36.

לחץ על מקש הרווח והחללית יורה: כל לחיצה מוסיפה ספרייט של לייזר לקבוצה lasers, והמונה בפינה השמאלית העליונה מציג כמה לייזרים הקבוצה מכילה. ירה כמה לייזרים ועקוב אחר המספר שעולה. הלייזרים עפים אל מחוץ לחלק העליון ולעולם לא נראים שוב, אבל הקבוצה עדיין מכילה את כולם, ועדיין מעדכנת ומציירת את כולם. אחרי כמה דקות של משחק, יש שם אלפי לייזרים בלתי נראים.

ספרייט שסיים מסיר את עצמו באמצעות kill():

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

kill() מסירה את הספרייט מכל קבוצה שהוא נמצא בה. הוא כבר לא מתעדכן או מצויר, ו-Python משחררת אותו ברגע שאף משתנה לא מפנה אליו. בדוק את bottom, לא את top: הלייזר יוצא רק אחרי שהפיקסל האחרון שלו יצא מהחלון, ולא כשחלק ממנו עדיין נראה.

sprite.alive() הוא True כל עוד הספרייט נמצא לפחות בקבוצה אחת.

challenge icon

אתגר

קל

ב־Laser.update, אחרי התזוזה, יש לקרוא ל־self.kill() כשה־rect.bottom של הלייזר נמצא מעל החלק העליון של החלון (פחות מ־0). המונה אמור לחזור ל־0 אחרי שכל הלייזרים יצאו.

נסו בעצמכם

import pygame

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

ship_image = pygame.image.load("assets/images/ship.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 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


player = Player()
lasers = pygame.sprite.Group()

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()

    screen.fill((20, 22, 40))
    lasers.draw(screen)
    screen.blit(player.image, player.rect)
    count = font.render(f"Lasers: {len(lasers)}", True, (240, 240, 240))
    screen.blit(count, (10, 10))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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