Menu
CoddyTech

Des objets avec des images

Fait partie de la section Sprites et images du Journey Pygame de Coddy. Leçon 14 sur 36.

Les ennemis sont des images qui se déplacent sur des Rect, et le code de départ gère à la main trois Rect et trois blits. Une classe peut regrouper une image et son Rect :

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)

L’image est passée en argument, elle n’est pas chargée dans __init__. Charge chaque fichier une seule fois au début et transmets la même Surface à chaque ennemi qui l’utilise : dix ennemis rouges partagent la même image rouge. Cependant, chaque ennemi a son propre Rect, et se déplace donc indépendamment.

Déplacer l’ennemi, c’est déplacer son Rect, et le dessiner, c’est afficher son image à l’emplacement du Rect : les deux attributs que possède chaque objet de jeu dans cette section.

challenge icon

Défi

Moyen
  1. Écris la classe Enemy avec __init__(self, image, x, y), update(self) et draw(self, screen), comme ci-dessus : le Rect centré en (x, y), qui descend de 2 pixels par image, puis revient au-dessus du bord supérieur une fois qu’il se trouve sous la fenêtre.
  2. Crée enemies, une liste de trois éléments : le rouge centré en (160, 100), le vert en (320, 100) et le jaune en (480, 100).
  3. Mets à jour et dessine chaque ennemi de la liste ; supprime les trois Rects.

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

red_rect = red.get_rect(center=(160, 100))
green_rect = green.get_rect(center=(320, 100))
yellow_rect = yellow.get_rect(center=(480, 100))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    for rect in (red_rect, green_rect, yellow_rect):
        rect.y += 2
        if rect.top > 480:
            rect.bottom = 0

    screen.fill((20, 22, 40))
    screen.blit(red, red_rect)
    screen.blit(green, green_rect)
    screen.blit(yellow, yellow_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Toutes les leçons de Sprites et images

Entraînez-vous par vous-même : Playground Pygame