Menu
CoddyTech

Mask

Termasuk bagian Sprite dan Gambar dalam perjalanan Pygame di Coddy. Pelajaran 22 dari 36.

Mask adalah kisi berisi ya dan tidak, satu nilai untuk setiap piksel: ya jika gambar terlihat padat, tidak jika gambar tembus pandang. pygame membuatnya dari gambar apa pun yang memiliki alpha:

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

Buat mask sekali saja, sebelum perulangan, seperti gambar asalnya.

Dua mask bertumpang tindih saat piksel padat dari satu mask berada di atas piksel padat dari mask lainnya. Mask tidak memiliki posisi, jadi kamu perlu menentukan letak mask kedua relatif terhadap mask pertama: offset, yaitu posisi kiri atas mask kedua dikurangi posisi kiri atas mask pertama.

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

overlap mengembalikan titik pertama tempat keduanya bersentuhan, atau None jika keduanya tidak bersentuhan, sehingga bisa digunakan sebagai pengujian dalam if. Jika offset-nya terbalik, bola akan diuji seolah-olah berada di sisi lain kapal.

Sekarang garis tepi merah membutuhkan kontak nyata: sudut-sudutnya saja tetap berwarna abu-abu.

challenge icon

Tantangan

Sedang
  1. Sebelum perulangan, buat ship_mask dan ball_mask dengan pygame.mask.from_surface.
  2. Warnai garis tepinya dengan warna merah ketika ship_mask.overlap(ball_mask, offset) menemukan sebuah titik, menggunakan offset dari ship_rect ke ball_rect; jika tidak, warnai dengan warna abu-abu.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Sprite dan Gambar

Latihan sendiri: Playground Pygame