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.
Sfida
Medio- Prima del ciclo, crea
ship_maskeball_maskconpygame.mask.from_surface. - Colora il contorno di rosso quando
ship_mask.overlap(ball_mask, offset)trova un punto, con l'offset daship_rectaball_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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Sprite e immagini
1Caricare immagini
Caricare un'immaginePosizionarla con un rettangoloSpostare l'immagineRipetere uno sfondoPixel trasparenti2Ruota, capovolgi, ridimensiona
Ruotare attorno al centroRivolgiti nella direzione in cui voliRidimensionare un'immagineRuotare dall'originale3Classi per gli oggetti del gioco
La tua prima classeMetodiSelf è l’oggettoUna lista di oggettiOggetti con immaginiUna sottoclasse6Animazione con gli sprite sheet
Ritagliare uno sprite sheetUn contatore di frameAnimare con il tempoUn’esplosione a riproduzione singolaEsercitati da solo: Playground Pygame