Pygame Sprite Groups Kullanımı

Bu yazıda Sprite sınıfına ait olan Groups container kullanılacak. Ayrıca eklediğimiz yılan karakterinin grid üzerine tam olarak oturtulması sağlanacak. Sprite Group, kısaca spritelerin tek bir yerde toplanmasıdır. Örneğin, kontrol ettiğimiz karakter, düşman oyun objeleri, diğer objeler vs. hepsi için ayrı ayrı sprite oluşturduğumuzu düşünürsek bunları tek bir yapı içinde toplayıp oyun döngüsü içinde aynı anda çizip, güncellenmesini sağlıyoruz. 

snake adlı oluşturduğum nesnenin hemen üstünde all_sprites_group adında pygame Group container oluşturuyorum. Tüm spriteları buraya ekleyeceğiz:
all_sprites_group = pygame.sprite.Group()
Önceki yazı ile paralel gittiğim için draw metotunu siliyoruz. Çünkü artık ona ihtiyacımız olmayacak sprite groups'tan dolayı. Snake sınıfına ait __init__ yani kurucu metotu parametresine Sprite Groups container'ı ekliyoruz. Sonrasında bunu groups adlı değişkene atayıp, super kurucu fonksiyona ikinci parametre olarak pass ediyoruz.
Kısacası Snake sprite sınıfımızı şu hale gelmiş oluyor:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        # ana sınıfı çağır
        self.groups = all_sprites_group
        pygame.sprite.Sprite.__init__(self, self.groups)
        
        self.image = pygame.Surface([w, h])
        self.image.fill(color)

        # image boyutlarına göre dikdörtgen nesnesi döndürülür
        self.rect = self.image.get_rect()
        # nesnenin pozisyonunu ayarla
        self.rect.x = x
        self.rect.y = y
Sonrasında ise snake adlı nesneyi oluştururken aşağıdaki gibi küçük bir ekleme yani sprite groups container pass ediliyor:
snake = Snake(all_sprites_group, 150, 60, 32, 32, (255, 0, 0))
Bu işlemden sonra tek yapmamız gereken oyun döngüsü içinde sprite group aracılığı ile karakter çizimi sağlamak. Döngü aşağıdaki gibi oluyor:
while True:
    for event in pygame.event.get():
        ...

    # çizim
    
    ...
    
    # sprite group içindeki tüm spritelar display yani ekrana çizdirilsin
    all_sprites_group.draw(display)

    pygame.display.flip()
Daha sonra çalıştırıldığında düzgün bir şekilde karakterin eklendiği görülecektir. Bu şekilde tüm spriteları tek bir grup içinde toplayıp aynı anda güncelleyip, çizdirebiliriz.

Yılan Nesnesini Hizalama

Çözmemiz gereken bir diğer sorun ise yılan nesnesini ızgaraya göre hizalama. Grid hücrelerine tam olarak oturtmak. Eğer farkettiyseniz her bir grid boyutu 32px boyutunda keza yılan nesnesi de 32px boyutunda. O zaman yapmamız gereken yılan nesnesini px değer ile konumlamak yerine grid miktarına göre konumlandırmak. Örneğin, ekranda genişlik olarak 22, yükseklik olarak 15 hücre bulunmakta. Yani toplamda 22 x 15 hücreden oluşmaktadır. Aşağıdaki resimde işaretli alanda yılan nesnesini başlangıç olarak konumlandırmak istediğimizi düşünelim:
Yılan Oyunu Pygame
Bizim yapmamız gereken işlem sadece x ekseni olduğunu varsayarsak 2, y ekseni olduğunu var sayarsak 1 değerini vermek olacaktır. 2*32'den ve 1*32'den yılan nesnesi tam olarak grid üstüne oturacaktır. Bunu yapabilmek için Snake sınıfında kurucu fonksiyonu aşağıdaki gibi gerekli yerleri düzenliyoruz:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        ...
        
        # nesnenin pozisyonunu ayarla
        self.rect.x = x * 32
        self.rect.y = y * 32
Sonrasında snake nesnesi oluştururken parametrelerde x: 2 ve y: 1 olarak verilir:
snake = Snake(all_sprites_group, 2, 1, 32, 32, (255, 0, 0))
Artık hizalama aşağıda olduğu gibi gerçekleşmiştir:
Yılan Oyunu Pygame
Kodun tam hali:
import pygame, sys

pygame.init()

display = pygame.display.set_mode((720, 480))

pygame.display.set_caption('Merhaba Dünya')

white = (255, 255, 255)

class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        # ana sınıfı çağır
        self.groups = all_sprites_group
        pygame.sprite.Sprite.__init__(self, self.groups)
        
        self.image = pygame.Surface([w, h])
        self.image.fill(color)

        # image boyutlarına göre dikdörtgen nesnesi döndürülür
        self.rect = self.image.get_rect()
        # nesnenin pozisyonunu ayarla
        self.rect.x = x * 32
        self.rect.y = y * 32
    
all_sprites_group = pygame.sprite.Group()

snake = Snake(all_sprites_group, 2, 1, 32, 32, (255, 0, 0))

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

    # çizim
    
    for x in range(0, 720, 32):
        pygame.draw.line(display, white, (x,0), (x,480))
    for y in range(0, 480, 32):
        pygame.draw.line(display, white, (0,y), (720,y))
    
    all_sprites_group.draw(display)

    pygame.display.flip()

sys.exit()

Hiç yorum yok:

Yorum Gönderme