Usuwanie za pomocą kill()
Część sekcji Sprite’y i obrazy ścieżki Pygame w Coddy. Lekcja 18 z 36.
Naciśnij spację, a statek wystrzeli: każde naciśnięcie dodaje duszka lasera do grupy lasers, a licznik w lewym górnym rogu pokazuje, ile ich jest w grupie. Wystrzel kilka i obserwuj, jak rośnie. Lasery wylatują górą i nigdy więcej ich nie widać, ale grupa nadal przechowuje każdy z nich, wciąż aktualizuje je wszystkie i rysuje. Po kilku minutach gry są to tysiące niewidocznych laserów.
Duszek, który zakończył działanie, usuwa się za pomocą kill():
def update(self):
self.rect.y -= 10
if self.rect.bottom < 0:
self.kill()kill() usuwa duszka ze wszystkich grup, do których należy. Nie jest już aktualizowany ani rysowany, a Python zwalnia zajmowaną przez niego pamięć, gdy żadna zmienna się do niego nie odwołuje. Sprawdzaj bottom, a nie top: laser znika, gdy jego ostatni piksel opuści okno, nigdy zaś wtedy, gdy choć jego część jest jeszcze widoczna.
sprite.alive() ma wartość True, gdy duszek należy do co najmniej jednej grupy.
Wyzwanie
ŁatwyW metodzie Laser.update, po przesunięciu wywołaj self.kill(), gdy rect.bottom lasera znajduje się powyżej górnej krawędzi okna (mniej niż 0). Licznik powinien wrócić do 0, gdy wszystkie lasery opuszczą okno.
Spróbuj swoich sił
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()
Wszystkie lekcje w sekcji Sprite’y i obrazy
1Wczytywanie obrazów
Wczytaj obrazUmieść go za pomocą RectPrzesuń obrazPowiel tłoPrzezroczyste piksele4Duszków i grupy
Klasa SpriteGrupyUsuwanie za pomocą kill()Wykrywanie kolizji za pomocą spritecollideGrupa przeciwko grupie2Obracaj, odbijaj, skaluj
Obracaj wokół środkaKieruj się w stronę lotuSkaluj obrazObracaj względem oryginału5Kolizje z dokładnością do piksela
Prostokąty wydają się niesprawiedliweMaskiSprite’y z dokładnością do pikselaKołowe hitboxy6Animacja z arkuszy sprite’ów
Przytnij arkusz sprite’ówLicznik klatekAnimacja w czasieJednorazowa eksplozjaPoćwicz samodzielnie: Edytor online Pygame