Pygame Sprite Kullanımı (Yılan Ekleme)

Önceki yazıda çizgiler aracılığı ile grid yani ızgara bir görünüm kazandırmıştık oyun ekranında. Şimdi ise sıra oyuncunun kontrol edeceği yılanı oyuna eklemeye geldi. Pygame içerisinde hazır bir class mevcuttur. Bu class, Sprite sınıfıdır. Kısaca açıklamak gerekirse oyunda bir şekilde kontrol edilmesi gereken nesneler bu sınıftan oluşturulur. Sprite sınıfı beraberinde Sprite.image ve Sprite.rect gibi özellikleri yanında getirmektedir. Cümle sonundaki bağlantıdan ayrıntılı bilgi edinebilirsiniz. (https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite)

Şimdi Sprite sınıfının yardımıyla yılan karakterini oyun için oluşturmaya başlayalım. Öncelikle Snake adında bir sınıf oluşturuyorum ve sonrasında Sprite sınıfından kalıtım alıyorum:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, x, y, w, h, color):
        # ana sınıfı çağır
        pygame.sprite.Sprite.__init__(self)
        
        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
Bir yılan nesnesi oluştururken parametre olarak o yılanın başlangıç poziyonunu, boyutunu ve rengini belirlememiz gerekiyor. Nesneyi oluşturalım ve ekrana çizdirmeye çalışalım. While döngüsünden hemen önce snake adında nesne oluşturuldu.
snake = Snake(150, 60, 32, 32, (255, 255, 0))
Buraya kadar her şey iyi gibi ama çizim kısmında bir sıkıntı var. Öncelikle Sprite sınıfı kendi içerisinde Group adı ile bilinen bir container'a sahip. Bu container, içinde Sprite nesnelerini barındırmaktadır. Oluşturduğumuz her sprite tek bir grupta toplanıyor. Bu sayede kodda büyük oranda azalma meydana geliyor. Her sprite'ı tek tek güncellemeye veya çizmeye gerek kalmıyor. Ancak ben şimdilik Group kısmını es geçeceğim. Nesneyi ekrana çizdirmek için Snake sınıfına draw() adında bir metot ekleyeceğim. Bu metot parametre olarak display yani ekran nesnesini alacak ve bu nesneye sprite nesnesi çizilecek. Bu şekilde ekran çizimi gerçekleşmiş olacak. İlk olarak draw metotu yazılır:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, x, y, w, h, color):
        ...
    
    def draw(self, display):
        display.blit(self.image, self.rect)
Artık oyun döngüsü içinde nesneyi çizdirebiliriz:
while True:
    for event in pygame.event.get():
        ...

    # çizim
    
    ...
    
    # snake nesnesini display nesnesine çiz
    snake.draw(display)

    pygame.display.flip()
Elde ettiğimiz sonuç görüntü aşağıdaki gibi olacaktır:
Pygame Sprite Ekleme
Görüldüğü gibi başarılı bir şekilde yılan nesnesini ekledik ama grid üzerine tam oturmadı. Bu durumu tile boyutunu kullanarak düzelteceğiz. Onu bir sonraki yazıda gerçekleştirmeyi düşünüyorum.

Öncelikle yukarıda Snake sınıfı için draw metotu yazmak yerine Sprite sınıfına ait Group nesnesini oluşturmak ve snake nesnesini bu gruba eklemek çok daha mantıklı ve faydalı bir kullanım. Bu sayede her sprite sınıfı için gereksiz yere draw metotu yazmamıza gerek kalmıyor. Group container kullanımı da aynı şekilde bir sonraki yazıda uygulanacak ancak burada tek başına ekrana nasıl sprite çizdirilir onu göstermek istedim.

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, x, y, w, h, color):
        # ana sınıfı çağır
        pygame.sprite.Sprite.__init__(self)
        
        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
    
    def draw(self, display):
        display.blit(self.image, self.rect)
    


snake = Snake(150, 60, 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))
    
    snake.draw(display)

    pygame.display.flip()

sys.exit()

Hiç yorum yok:

Yorum Gönderme