Menu
CoddyTech

Hapus dengan kill()

Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 18 dari 36.

Tekan Space dan kapal menembak: setiap tekanan menambahkan sprite Laser ke grup lasers, dan penghitung di kiri atas menunjukkan jumlah sprite yang ada di grup tersebut. Tembakkan beberapa laser dan lihat jumlahnya bertambah. Laser terbang ke luar bagian atas layar dan tidak pernah terlihat lagi, tetapi grup tetap menyimpan semuanya, serta terus memperbarui dan menggambar semuanya. Setelah beberapa menit bermain, jumlahnya mencapai ribuan laser yang tidak terlihat.

Sprite yang sudah selesai menghapus dirinya sendiri dengan kill():

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

kill() mengeluarkan sprite dari setiap grup tempatnya berada. Sprite itu tidak lagi diperbarui atau digambar, dan Python membebaskannya setelah tidak ada variabel yang merujuk kepadanya. Periksa bottom, bukan top: laser baru pergi setelah piksel terakhirnya keluar dari jendela, tidak saat sebagian laser masih terlihat.

sprite.alive() bernilai True selama sprite berada di setidaknya satu grup.

challenge icon

Tantangan

Mudah

Di Laser.update, setelah bergerak, panggil self.kill() saat rect.bottom laser berada di atas bagian atas jendela (kurang dari 0). Penghitung akan kembali ke 0 setelah semua laser keluar.

Coba sendiri

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

Semua pelajaran di Sprite dan Gambar

Latihan sendiri: Playground Pygame