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.
Thử thách
DễXóa từng tia laser khi nó bay ra khỏi cửa sổ.
- Trong
Laser.update, sau khi di chuyển, kiểm traself.rect.bottom < 0. - 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
5Va chạm chính xác đến từng pixel
Hình chữ nhật thật bất côngMặt nạSprite chính xác đến từng pixelVùng va chạm hình tròn3Lớp cho đối tượng trong trò chơi
Lớp đầu tiên của bạnPhương thứcSelf là đối tượngDanh sách đối tượngĐối tượng có hình ảnhDanh sách kẻ địchLớp con6Hoạt ảnh từ sprite sheet
Cắt sprite sheetBộ đếm khung hìnhTạo hoạt ảnh theo thời gianHiệu ứng nổ chỉ chạy một lầnTự luyện tập: Playground Pygame