Pygame Yılanı Hareket Ettirme

Yılanı hareket ettirmeyi bu yazıda sağlayacağız. İlk olarak Snake sprite sınıfında move adında bir metot oluşturuyoruz. Bu metot event loop içinde kullanılacaktır. Örneğin, oyuncu yukarı tuşuna bastığında move fonksiyonu parametresi y=-1 olmak üzere bir birim yukarı çıkacaktır. Ancak her ne kadar değerler üzerinde değişiklik olsa bile bu durum çizimlere yansımayacaktır çünkü sprite update edilmeden görüntünün değişmesi mümkün değildir. Bu sebeple update adında metot yazılır ve yılan karakterinin ekrandaki konumu görünüm olarak güncellenir:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        ...
    
    def move(self, x=0, y=0):
        self.x += x
        self.y += y

    def update(self):
        self.rect.x = self.x * 32
        self.rect.y = self.y * 32
Sıra move metotunu oyun döngüsünde yer alan event loop içinde kullanmaya geldi. Oyuncu, yukarı ok tuşuna bastığında y=-1, aşağı ok tuşuna bastığında y=1, sağ ok tuşuna bastığında x=1 ve sol ok tuşuna bastığında x=-1 argümanlarını alacaktır:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                snake.move(x=-1)
            if event.key == pygame.K_RIGHT:
                snake.move(x=1)
            if event.key == pygame.K_UP:
                snake.move(y=-1)
            if event.key == pygame.K_DOWN:
                snake.move(y=1)
Şimdi oyunu çalıştıralım ve hareket işleminin nasıl gerçekleştiğine bakalım:
Pygame Yılan Oyunu
Görüldüğü gibi yılanı hareket ettirdiğimizde geçtiği her yeri kırmızı yapıyor. Bunun çözümü ise oldukça basit. Her güncelleme esnasında yine aynı şekilde ekranı da siyah renk ile doldurursak çözüm sağlanmış olur:
    # çizim
    display.fill((0,0,0))
    
    for x in range(0, 720, 32):
        ...
    for y in range(0, 480, 32):
        ...

    all_sprites_group.draw(display)
    pygame.display.flip()
Oyunu tekrar çalıştırdığımızda ise aşağıdaki sonucu elde ederiz:
Pygame Yılan Oyunu
Normalde yılan oyununda yılan sürekli hareket eder, oyuncu ise ona sadece yön verir. Ancak şu ana kadar yılanı hareket ettirmek tuşlara tekrar basılı tutmalıyız. Normal sadece bir kere sol ok tuşuna bastığımızda yılan hiç durmadan sol yöne doğru hareket etmeli.

Yön doğrultusunda hareket yapılacağı için dir adında bir özellik tanımlanır Snake sınıfı içinde ve move fonksiyonu aşağıdaki gibi güncellenir, yılan hareket ettikten sonra aktif yönde durmadan hareket etmesi gerektiği için update fonksiyonu da yine aşağıdaki gibi değiştirilir:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        ...
        self.dir = ""
    
    def move(self, dir):
        self.dir = dir

    def update(self):
        if self.dir == 'left':
            self.rect.x -= 1 * 32
            self.x -= 1 
            self.rect.y = self.y * 32
        if self.dir == 'right':
            self.rect.x += 1 * 32
            self.x += 1 
            self.rect.y = self.y * 32
        if self.dir == 'up':
            self.rect.x = self.x * 32
            self.rect.y -= 1 * 32
            self.y -= 1
        if self.dir == 'down':
            self.rect.x = self.x * 32
            self.rect.y += 1 * 32
            self.y += 1
Nesnenin yönlere göre hareket ettirilmesi için event loop içinde aşağıdaki değişiklikler yapılır:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                snake.move(dir='left')
            if event.key == pygame.K_RIGHT:
                snake.move(dir='right')
            if event.key == pygame.K_UP:
                snake.move(dir='up')
            if event.key == pygame.K_DOWN:
                snake.move(dir='down')
Oyun çalıştırıldığında ve yılan hareket ettirildiğinde muhtemelen ekranda hiçbir şey görünmeyecektir. Bu durumda yapmamız gereken oldukça basit, kare hızını düşürmek olacaktır. Bunun için tick metotu kullanılacak. İlk olarak clock adında bir zaman nesnesi tanımlanır:
display = pygame.display.set_mode((720, 480))

# **
clock = pygame.time.Clock() 

pygame.display.set_caption('Merhaba Dünya')
Sonrasında oyun döngüsü içinde flip fonksiyonundan sonra tick metotu aşağıdaki gibi kullanılır:
while True:
    for event in pygame.event.get():
        ...
    # güncelle
    ...

    # çizim
    ...
    pygame.display.flip()
    
    clock.tick(5)
clock.tick(5)'in anlamı her bir saniyede sadece 5 frame(kare) gösterileceğidir. Bu kısım oldukça önemli çünkü yılanın hızını yine tick metotuna göre değiştireceğiz.

2 yorum:

  1. Bunun için yüklememiz gereken bir paket var mı, çalıştıramadım bir türlü.

    YanıtlayınSil
    Yanıtlar
    1. Öncelikle Python'un kurulu olmalıdır. Sonrasında ise modül olarak Pygame yüklenmelidir. pip install pygame komutu ile terminal(cmd) üzerinden yükleyebilirsiniz. Eğer çalışmadıysa pip muhtemelen kurulu değildir, onu da yüklemelisiniz.

      Sil