Menu
CoddyTech

Xóa bằng kill()

Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 19 trên 39.

Nhấn Space, tàu sẽ bắn: mỗi lần nhấn sẽ thêm một sprite Laser vào nhóm lasers, còn bộ đếm ở góc trên bên trái cho biết nhóm đang chứa bao nhiêu sprite. Hãy bắn vài phát và xem con số tăng lên. Các tia laser bay khỏi phía trên cửa sổ và không bao giờ xuất hiện lại, nhưng nhóm vẫn chứa tất cả chúng, đồng thời vẫn cập nhật và vẽ tất cả. Sau vài phút chơi, có hàng nghìn tia laser vô hình như vậy.

Một sprite đã hoàn thành sẽ tự xóa bằng kill():

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

kill() xóa sprite khỏi mọi nhóm chứa nó. Sprite đó sẽ không còn được cập nhật hay vẽ nữa, và Python sẽ giải phóng nó khi không còn biến nào tham chiếu đến nó. Kiểm tra bottom, không phải top: tia laser biến mất khi pixel cuối cùng của nó rời khỏi cửa sổ, chứ không phải khi nó vẫn còn hiển thị một phần.

sprite.alive() trả về True khi sprite nằm trong ít nhất một nhóm.

challenge icon

Thử thách

Dễ

Xóa từng tia laser khi nó bay ra khỏi cửa sổ.

  1. Trong Laser.update, sau khi di chuyển, kiểm tra self.rect.bottom < 0.
  2. Khi điều kiện đúng, gọi self.kill().

Nhấn Chơi và bắn vài tia: bộ đếm trở về 0 khi chúng biến mất. Sau đó nhấn Kiểm tra.

Tự làm thử

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

Tất cả bài học trong Sprite và hình ảnh

Tự luyện tập: Playground Pygame