Piksel Hassasiyetinde Sprite'lar
Coddy'nin Pygame Journey'sinin Sprite'lar ve Görseller bölümünün bir parçası. Ders 23 / 36.
Kaplamalar da maskeler kullanabilir ve pygame ofseti sizin için ayarlar. Her kaplamaya bir self.mask verin; bunu __init__ içinde bir kez oluşturun:
self.mask = pygame.mask.from_surface(self.image)Ardından pygame.sprite.collide_mask işlevini spritecollide işlevine dördüncü bağımsız değişken olarak verin:
hits = pygame.sprite.spritecollide(player, balls, False, pygame.sprite.collide_mask)Dördüncü bağımsız değişken, her çift için kullanılan sınamadır. Bu bağımsız değişken olmadan sınama Rect'ler üzerinden yapılır. collide_mask ile sınama, her kaplamanın Rect'i tarafından yerleştirilen maskeler üzerinden yapılır. groupcollide aynı beşinci bağımsız değişkeni alır.
Maske sınamaları Rect sınamalarından daha fazla maliyetlidir, ancak overlap yalnızca iki Rect'in örtüştüğü pikselleri karşılaştırır; bu nedenle birbirinden uzaktaki çiftler hızlıca sınanır. Birkaç düzine kaplama için bu maliyeti fark etmezsiniz. Bir kaplamanın mask'i yoksa collide_mask her sınamada görüntüsünden bir maske oluşturur; bu yüzden maskeyi __init__ içinde ayarlayın.
Görev
OrtaPlayerveBallnesnelerineself.imagekullanılarak oluşturulmuş birself.maskverin.pygame.sprite.collide_maskişlevinispritecollideişlevine aktarın; böyleceHit!yalnızca geminin görseli bir topa dokunduğunda gösterilir.
Kendin dene
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Spike Field")
clock = pygame.time.Clock()
ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
ball_image = pygame.image.load("assets/images/spike_ball.png").convert_alpha()
font = pygame.font.Font(None, 40)
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = ship_image
self.rect = self.image.get_rect(topleft=(420, 320))
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.rect.x -= 4
if keys[pygame.K_RIGHT]:
self.rect.x += 4
if keys[pygame.K_UP]:
self.rect.y -= 4
if keys[pygame.K_DOWN]:
self.rect.y += 4
class Ball(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = ball_image
self.rect = self.image.get_rect(center=(x, y))
player = Player()
balls = pygame.sprite.Group(Ball(160, 240), Ball(320, 240), Ball(480, 240))
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
player.update()
hits = pygame.sprite.spritecollide(player, balls, False)
screen.fill((20, 22, 40))
balls.draw(screen)
screen.blit(player.image, player.rect)
if hits:
text = font.render("Hit!", True, (240, 240, 240))
screen.blit(text, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
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