Menu
CoddyTech

Maskeler

Coddy'nin Pygame Journey'sinin Sprite'lar ve Görseller bölümünün bir parçası. Ders 22 / 36.

Maske, her piksel için bir evet veya hayır değeri içeren bir ızgaradır: resmin opak olduğu yerlerde evet, şeffaf olduğu yerlerde hayır. pygame, alfaya sahip herhangi bir görselden maske oluşturur:

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

Görseller gibi maskeleri de döngüden önce, bir kez oluştur.

Bir maskenin opak bir pikseli diğer maskenin opak bir pikselinin üzerine geldiğinde bu iki maske örtüşür. Maskenin konumu olmadığından, ikinci maskenin birinciye göre nerede bulunduğunu belirtirsin: ofset, diğer maskenin sol üst köşesinin bu maskeninkine göre konumudur.

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

overlap, maskelerin temas ettiği ilk noktayı döndürür; temas etmiyorlarsa None döndürür. Bu nedenle if içinde bir kontrol olarak kullanılabilir. Ofseti ters hesaplarsan top, geminin diğer tarafındaymış gibi kontrol edilir.

Artık kırmızı çerçevenin gerçek bir temasa ihtiyacı var: köşeler tek başına gri kalıyor.

challenge icon

Görev

Orta
  1. Döngüden önce, pygame.mask.from_surface ile ship_mask ve ball_mask oluştur.
  2. ship_mask.overlap(ball_mask, offset), ship_rect'ten ball_rect'e olan ofsetle bir nokta bulursa dış çizgiyi kırmızıya, aksi hâlde griye boya.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Sprite'lar ve Görseller bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground