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.
Aufgabe
Mittel- Erstelle vor der Schleife
ship_maskundball_maskmitpygame.mask.from_surface. - Färbe die Umrandung rot, wenn
ship_mask.overlap(ball_mask, offset)mit dem Versatz vonship_rectzuball_recteinen 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()
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
1Bilder laden
Ein Bild ladenMit einem Rect platzierenDas Bild bewegenEinen Hintergrund kachelnTransparente Pixel2Drehen, Spiegeln, Skalieren
Um den Mittelpunkt drehenIn Flugrichtung ausrichtenEin Bild skalierenVom Original aus drehen3Klassen für Spielobjekte
Deine erste KlasseMethodenSelf ist das ObjektEine Liste von ObjektenObjekte mit BildernEine Unterklasse6Animation mit Sprite Sheets
Ein Sprite Sheet zuschneidenEin Frame-ZählerMit Zeit animierenEine einmalige ExplosionÜbe selbstständig: Pygame-Playground