Menu
CoddyTech

Maschere

Fa parte della sezione Sprite e immagini del percorso Pygame di Coddy. Lezione 22 di 36.

Una maschera è una griglia di sì e no, uno per pixel: sì dove l'immagine è opaca, no dove è trasparente. pygame ne crea una da qualsiasi immagine con canale alfa:

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

Crea le maschere una sola volta, prima del ciclo, come le immagini da cui provengono.

Due maschere si sovrappongono quando un pixel opaco di una cade su un pixel opaco dell'altra. Una maschera non ha una posizione, quindi specifichi dove si trova la seconda rispetto alla prima: l'offset, ovvero l'angolo in alto a sinistra dell'altra meno l'angolo in alto a sinistra di questa.

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

overlap restituisce il primo punto in cui si toccano, oppure None se non si toccano, quindi funziona come condizione in un if. Se inverti l'offset, la palla viene verificata come se si trovasse dall'altra parte dell'astronave.

Ora il contorno rosso richiede un contatto reale: solo gli angoli restano grigi.

challenge icon

Sfida

Medio
  1. Prima del ciclo, crea ship_mask e ball_mask con pygame.mask.from_surface.
  2. Colora il contorno di rosso quando ship_mask.overlap(ball_mask, offset) trova un punto, con l'offset da ship_rect a ball_rect; altrimenti, di grigio.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Sprite e immagini

Esercitati da solo: Playground Pygame