Menu
CoddyTech

Masques

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

Un masque est une grille de oui et de non, une valeur par pixel : oui là où l’image est opaque, non là où elle est transparente. pygame en crée un à partir de n’importe quelle image avec un canal alpha :

ship_mask = pygame.mask.from_surface(ship)
ball_mask = pygame.mask.from_surface(ball)

Crée les masques une seule fois, avant la boucle, comme les images dont ils proviennent.

Deux masques se chevauchent lorsqu’un pixel opaque de l’un se superpose à un pixel opaque de l’autre. Un masque n’a pas de position, il faut donc indiquer où se trouve le second par rapport au premier : le décalage, c’est-à-dire le coin supérieur gauche de l’autre moins celui de celui-ci.

offset = (ball_rect.x - ship_rect.x, ball_rect.y - ship_rect.y)
if ship_mask.overlap(ball_mask, offset):

overlap renvoie le premier point où ils se touchent, ou None s’ils ne se touchent pas. Il peut donc servir de test dans un if. Si tu calcules le décalage dans le mauvais sens, la balle est testée comme si elle se trouvait de l’autre côté du vaisseau.

Maintenant, le contour rouge nécessite un véritable contact : les coins seuls restent gris.

challenge icon

Défi

Moyen
  1. Avant la boucle, créez ship_mask et ball_mask avec pygame.mask.from_surface.
  2. Colorez le contour en rouge lorsque ship_mask.overlap(ball_mask, offset) trouve un point, avec le décalage de ship_rect à ball_rect ; en gris autrement.

Essayez vous-même

import pygame

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

ship = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship.get_rect(topleft=(420, 320))
ball = pygame.image.load("assets/images/spike_ball.png").convert_alpha()
ball_rect = ball.get_rect(center=(320, 240))

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

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        ship_rect.x -= 4
    if keys[pygame.K_RIGHT]:
        ship_rect.x += 4
    if keys[pygame.K_UP]:
        ship_rect.y -= 4
    if keys[pygame.K_DOWN]:
        ship_rect.y += 4

    screen.fill((20, 22, 40))
    screen.blit(ball, ball_rect)
    screen.blit(ship, ship_rect)
    if ship_rect.colliderect(ball_rect):
        colour = (230, 60, 60)
    else:
        colour = (90, 90, 120)
    pygame.draw.rect(screen, colour, ball_rect, 2)
    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