Menu
CoddyTech

الإزالة باستخدام kill()

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

اضغط على مفتاح المسافة، فستطلق السفينة النار: كل ضغطة تضيف كائنًا مرئيًا من نوع Laser إلى المجموعة 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()

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

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