Menu
CoddyTech

Masken

Teil des Abschnitts Sprites und Bilder der Pygame-Journey von Coddy. Lektion 22 von 36.

Eine Maske ist ein Raster aus Ja und Nein, jeweils eines pro Pixel: Ja, wo das Bild undurchsichtig ist, Nein, wo es durchsichtig ist. pygame erstellt eine aus jedem Bild mit Alphakanal:

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

Erstelle die Masken einmal vor der Schleife, so wie die Bilder, aus denen sie erzeugt werden.

Zwei Masken überlappen sich, wenn ein undurchsichtiger Pixel der einen auf einem undurchsichtigen Pixel der anderen liegt. Eine Maske hat keine Position, daher gibst du an, wo die zweite im Vergleich zur ersten liegt: den Versatz, also die obere linke Ecke der anderen minus die obere linke Ecke dieser Maske.

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

overlap gibt den ersten Berührungspunkt zurück oder None, wenn sie sich nicht berühren. Deshalb eignet es sich als Bedingung in einem if. Wenn du den Versatz vertauschst, wird der Ball so getestet, als läge er auf der anderen Seite des Schiffs.

Jetzt braucht die rote Umrandung echten Kontakt: Nur die Ecken bleiben grau.

challenge icon

Aufgabe

Mittel
  1. Erstelle vor der Schleife ship_mask und ball_mask mit pygame.mask.from_surface.
  2. Färbe die Umrandung rot, wenn ship_mask.overlap(ball_mask, offset) mit dem Versatz von ship_rect zu ball_rect einen Punkt findet, andernfalls grau.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Sprites und Bilder

Übe selbstständig: Pygame-Playground