Menu
CoddyTech

Pixels transparents

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

Un fichier image est toujours un rectangle, mais un vaisseau ennemi ne l’est pas. Les pixels qui l’entourent sont transparents : chaque pixel d’un PNG possède un quatrième nombre, son alpha, compris entre 0 (transparent) et 255 (opaque).

Le projet de départ charge les trois ennemis avec convert(), qui supprime l’alpha : chaque pixel transparent devient noir, et chaque ennemi se retrouve dans un rectangle noir. convert_alpha() conserve l’alpha, de sorte que seuls les pixels opaques recouvrent la fenêtre. Utilise-le pour tout ce qui n’est pas un rectangle opaque.

Le Rect correspond toujours à tout le rectangle. Trace son contour pour voir la boîte occupée par l’image :

rect = red.get_rect(topleft=(128, 200))
screen.blit(red, rect)
pygame.draw.rect(screen, (90, 90, 120), rect, 1)

Le dernier nombre, 1, trace le contour du Rect sur 1 pixel au lieu de le remplir. Observe les espaces entre le contour et le vaisseau. Deux Rects peuvent se chevaucher alors que les images qu’ils contiennent ne se touchent pas, et un test de collision avec des Rects indique quand même qu’ils se sont heurtés. Le chapitre 5 corrige cela.

challenge icon

Défi

Facile
  1. Charge les trois ennemis avec .convert_alpha() au lieu de .convert(), pour faire disparaître les boîtes noires.
  2. Après chaque ennemi, trace le contour de son Rect en (90, 90, 120), avec une épaisseur de 1 pixel. Les ennemis restent à (128, 200), (288, 200) et (448, 200).

Essayez vous-même

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Three Enemies")
clock = pygame.time.Clock()

red = pygame.image.load("assets/images/enemy_red.png").convert()
green = pygame.image.load("assets/images/enemy_green.png").convert()
yellow = pygame.image.load("assets/images/enemy_yellow.png").convert()

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

    screen.fill((20, 22, 40))
    screen.blit(red, (128, 200))
    screen.blit(green, (288, 200))
    screen.blit(yellow, (448, 200))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTestez-vous

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

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