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.
Görev
Orta- Döngüden önce,
pygame.mask.from_surfaceileship_maskveball_maskoluştur. ship_mask.overlap(ball_mask, offset),ship_rect'tenball_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()
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
4Sprite'lar ve Gruplar
Sprite SınıfıGruplarkill() ile Kaldırmaspritecollide ile YakalamaGruba Karşı Grup2Döndür, Yansıt, Ölçekle
Merkez Etrafında DöndürUçtuğun Yöne DönBir Görseli ÖlçekleOrijinalinden Döndür5Piksel Hassasiyetinde Çarpışmalar
Dikdörtgenler Haksız HissettiriyorMaskelerPiksel Hassasiyetinde Sprite'larDaire Hitbox'ları3Oyun Nesneleri için Sınıflar
İlk SınıfınızMetotlarSelf Nesnenin KendisidirNesneler ListesiGörselli NesnelerBir Alt Sınıf6Sprite Sheet'lerden Animasyon
Bir Sprite Sheet'i KesmekBir Kare SayacıZamanla AnimasyonTek Seferlik Bir PatlamaKendi başına pratik yap: Pygame playground