마스크
Coddy Pygame 여정의 스프라이트와 이미지 섹션에 포함된 레슨. 36개 중 22번째.
마스크는 픽셀마다 참 또는 거짓을 나타내는 격자입니다. 그림이 불투명한 곳은 참, 투명한 곳은 거짓입니다. pygame은 알파 채널이 있는 이미지로 마스크를 만듭니다.
ship_mask = pygame.mask.from_surface(ship)
ball_mask = pygame.mask.from_surface(ball)마스크는 원본 이미지와 마찬가지로 루프 전에 한 번만 만드세요.
한 마스크의 불투명한 픽셀이 다른 마스크의 불투명한 픽셀 위에 놓이면 두 마스크가 겹칩니다. 마스크에는 위치가 없으므로 두 번째 마스크가 첫 번째 마스크에 비해 어디에 놓이는지, 즉 다른 마스크의 왼쪽 위 위치에서 이 마스크의 왼쪽 위 위치를 뺀 오프셋을 지정해야 합니다.
offset = (ball_rect.x - ship_rect.x, ball_rect.y - ship_rect.y)
if ship_mask.overlap(ball_mask, offset):overlap은 두 마스크가 맞닿는 첫 번째 지점을 반환하고, 맞닿지 않으면 None을 반환하므로 if의 조건으로 사용할 수 있습니다. 오프셋의 방향을 반대로 하면 공이 배의 반대편에 놓인 것처럼 검사됩니다.
이제 빨간 윤곽선은 실제로 닿아야 합니다. 모서리만으로는 회색 상태를 유지합니다.
챌린지
중급- 루프 전에
pygame.mask.from_surface를 사용해ship_mask와ball_mask를 만드세요. ship_mask.overlap(ball_mask, offset)가ship_rect에서ball_rect까지의 오프셋으로 점을 찾으면 윤곽선을 빨간색으로, 그렇지 않으면 회색으로 표시하세요.
직접 해보기
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()
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
스프라이트와 이미지의 모든 레슨
직접 연습해 보세요: Pygame 플레이그라운드