Podklasa
Część sekcji Sprite’y i obrazy ścieżki Pygame w Coddy. Lekcja 15 z 36.
Niektórzy wrogowie powinni poruszać się zygzakiem. Opadają tak jak pozostali, a także przesuwają się na boki, zmieniając kierunek przy krawędziach okna. Skopiowanie całej klasy Enemy, aby zmienić jedną metodę, oznaczałoby konieczność naprawiania każdego błędu dwa razy. Podklasa dziedziczy wszystko po klasie nadrzędnej i zmienia tylko to, co jest inne:
class Zigzag(Enemy):
def __init__(self, image, x, y):
super().__init__(image, x, y)
self.dx = 3
def update(self):
super().update()
self.rect.x += self.dx
if self.rect.left < 0 or self.rect.right > 640:
self.dx = -self.dxclass Zigzag(Enemy) oznacza, że obiekt Zigzag jest obiektem Enemy. Ma metodę draw bez konieczności jej zapisywania. Własna metoda update zastępuje metodę klasy nadrzędnej, a super().update() najpierw uruchamia jej wersję, więc opadanie i powrót na górę nie są zapisywane dwa razy. super().__init__(...) robi to samo podczas inicjalizacji.
Obiekt Zigzag trafia na tę samą listę co pozostałe: pętla wywołuje enemy.update(), a każdy obiekt uruchamia własną wersję metody update.
Wyzwanie
Średni- Napisz
class Zigzag(Enemy): jego__init__wywołujesuper().__init__(image, x, y)i ustawiaself.dx = 3. - Jego
updatewywołujesuper().update(), dodajeself.dxdoself.rect.xi zmienia znakself.dx, gdy Rect wystaje poza lewą lub prawą krawędź. - Zmień żółtego przeciwnika w
enemiesw Zigzag; czerwony i zielony pozostają typu Enemy.
Spróbuj swoich sił
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Enemy Rain")
clock = pygame.time.Clock()
red = pygame.image.load("assets/images/enemy_red.png").convert_alpha()
green = pygame.image.load("assets/images/enemy_green.png").convert_alpha()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert_alpha()
class Enemy:
def __init__(self, image, x, y):
self.image = image
self.rect = image.get_rect(center=(x, y))
self.speed = 2
def update(self):
self.rect.y += self.speed
if self.rect.top > 480:
self.rect.bottom = 0
def draw(self, screen):
screen.blit(self.image, self.rect)
enemies = [Enemy(red, 160, 100), Enemy(green, 320, 100), Enemy(yellow, 480, 100)]
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
for enemy in enemies:
enemy.update()
screen.fill((20, 22, 40))
for enemy in enemies:
enemy.draw(screen)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Sprite’y i obrazy
1Wczytywanie obrazów
Wczytaj obrazUmieść go za pomocą RectPrzesuń obrazPowiel tłoPrzezroczyste piksele2Obracaj, 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