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.
Défi
Moyen- Avant la boucle, créez
ship_masketball_maskavecpygame.mask.from_surface. - Colorez le contour en rouge lorsque
ship_mask.overlap(ball_mask, offset)trouve un point, avec le décalage deship_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()
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