Une sous-classe
Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 15 sur 36.
Certains ennemis devraient se déplacer en zigzag. Ils tombent comme les autres et glissent aussi latéralement, en changeant de direction au bord de la fenêtre. Copier toute la classe Enemy pour modifier une méthode obligerait à corriger chaque bogue deux fois. Une sous-classe hérite de tout de sa classe parente et ne modifie que ce qui diffère :
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) signifie qu’un Zigzag est un Enemy. Il possède draw sans qu’il soit nécessaire de l’écrire. Sa propre méthode update remplace celle de la classe parente, et super().update() exécute d’abord la version de la classe parente, donc la chute et le retour en haut ne sont pas écrits deux fois. super().__init__(...) fait la même chose pour l’initialisation.
Un Zigzag va dans la même liste que les autres : la boucle appelle enemy.update() et chaque objet exécute sa propre version de update.
Défi
Moyen- Écrivez
class Zigzag(Enemy): son__init__appellesuper().__init__(image, x, y)et définitself.dx = 3. - Sa méthode
updateappellesuper().update(), ajouteself.dxàself.rect.xet inverse le signe deself.dxlorsque le Rect dépasse du bord gauche ou droit. - Faites de l’ennemi jaune dans
enemiesun Zigzag ; les ennemis rouge et vert restent des Enemy.
Essayez vous-même
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()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Sprites et images
1Charger des images
Charger une imageLa placer avec un rectangleDéplacer l’imageRépéter un arrière-planPixels transparents2Tourner, retourner, redimensionner
Faire pivoter autour du centreRegarder dans la direction du volRedimensionner une imagePivoter à partir de l’original5Collisions au pixel près
Les rectangles semblent injustesMasquesSprites au pixel prèsZones de collision circulaires3Les classes pour les objets du jeu
Votre première classeLes méthodesSelf est l’objetUne liste d’objetsDes objets avec des imagesUne sous-classe6Animation à partir de feuilles de sprites
Découper une feuille de spritesUn compteur de framesAnimer avec le tempsUne explosion à déclenchement uniqueEntraînez-vous par vous-même : Playground Pygame