PyGame İçin Program İskeleti ve Anlamları

Python ile oyun dünyasına giriş yapmak istiyorsanız muhtemelen ilk durağınız pygame olacak. Bu konuda çok fazla sayıda Türkçe döküman olmadığı için öğrendiklerimi aktarmak istiyorum. Ayrıca, Python ile oyun yazma hakkında bir kitabın çevirisi için şu an yazarıyla görüşüyoruz. Bu yazıda PyGame ile yazılacak olan uygulamada genel yapıyı ve anlamlarını ele alalım.

import pygame

pygame.init()

cozunurluk = [800,600]
pencere = pygame.display.set_mode(cozunurluk)

baslik = pygame.display.set_caption("Oyun v0.1")

FPS = 50
saat = pygame.time.Clock()

kapat = False
while kapat == False:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            kapat = True
    # Programda kullanılacak öğeler buranın altında oluşturulacak, değişiklikler buranın altında yapılacak
    # Programda kullanılacak öğeler buranın üzerinde oluşturulacak, değişiklikler buranın üzerinde yapılacak.

    # Ekrana bastırılacak öğeler buranın altında bastırılacak.
    # Ekrana bastırılacak öğeler buranın üzerinde bastırılacak.
    saat.tick(FPS)
    pygame.display.flip()
pygame.quit()

Öncelikle, normalde programın kapatılabilmesi için sys modülündekisys.exit() fonksiyonundan faydalanılır. Burda bunu kullanmaktan kurtulmuş olduk.  Ayrıca genelde o komut hata veriyordu(en azından benim bilgisayarımda), kapanıyor olsa da pek mutlu kapanmıyordu. Bu yapıda böyle bir sıkıntımız kalmamış oluyor. Hazır başlamışken söyleyeyim, normalde Python programı kapattığınızda arkada çalışmakta olan işlemleri sonlandırır ve siler. Ancak IDLE ile çalışıyorsanız Pygame’de bu gerçekleşmiyor. Son satırdaki pygame.quit() yapısı da bunun gerçekleşmesini sağlamak için var. Yani siz IDLE dışında(ya da başka bir IDE altında sorun yaşıyorsanız onun dışında) Python çekirdeği ile uygulamalarınızı çalıştırırken son satırı yazmak zorunda değilsiniz. Yine de, kodunuzu dağıtmak istiyorsanız kullanıcıları düşünerek bulundurmanızı öneririm.

Şimdi en baştan açıklamaya başlayalım. Elimizde 800×600 çözünürlüğünde bir pencere olmasını, başlığının “Oyun v0.1” olmasını istiyoruz. Ayrıca oyunun 50 FPS’de çalışmasını, yani saniyede 50 kere ekranın yenilenmesini istiyoruz. FPS konusuna yazını devamında tekrar gireceğiz.

İlk olarak pygame modülünü import ederek başladık (satır 1). 3. satırda ise pygame framework ünü kullanabilmemiz için init() fonksiyonu ile başlattık. Bu işlem pygame ile yazacağımız oyunlarda bir standart durumunda(en azından şu ana kadar gördüklerimde).

  1. satırda istediğimiz çözünürlük değerini bir liste içerisinde cozunurluk isimli değişkene atıyoruz. Daha sonra bunu pencere boyutu olarak kullanabilmek için ve pencerenin üzerine daha sonra istediklerimizi çizebilmek için bir pencere nesnesi oluşturuyoruz. Yani kısaca, pygame.display.set_mode(cozunurluk) fonksiyonunun sonucunu pencere isimli bir değişkene atıyoruz. Bu değişken, elimizde bir yüzey durumunda. Bunu bir masa gibi düşünürsek artık oyunda yer alacak her görseli bunun üzerine koyacağız, oynayanlar da tam tepesinden bakmış olacak. Bu arada, çözünürlüğü liste şeklinde değil de, demet şeklinde de yazabilirdik. Herhangi bir fark olmamakla birlikte, belki farkedilmeyecek bir hız farkı olabilir, o da liste-demet ayrışımından. Ama dediğim gibi, 2 öğeli bir liste veya demet arasında farkedilebilir hız farkının olması çok çok zor.

  2. satırda baslik isimli değişkeni kullanacak pencere başlığını ayarlıyoruz. Buradaki fonksiyon zaten yeterince açık, aldığı parametreye başlığı string olarak veriyoruz. Türkçe karakterler kullanabiliriz. Bu arada, burda baslik değişkenine değer atamamız zorunlu değil. pygame.display.set_caption(“Oyun başlığı”) yazdığımızda yine atama gerçekleşmiş oluyor.

  3. satırda oyunun FPS değerini(Frame Per Second, saniyedeki çerçeve sayısı) yazdık. Bu değer, 1 saniye içerisinde uygulamanın ekranda kaç kez yeniden çizileceğini belirtiyor. Alternatif akımın frekansı gibi düşünebiliriz. 11. satırda ise bu değeri daha sonra oyun döngüsünde kullanabilmek için saat isminde bir değişkene pygame.time.Clock() fonksiyonunun değerini atıyoruz. Daha sonra, programın ana döngüsü başladığında, 23. satırdaki gibi saat.tick(FPS) yapısıyla bu değeri uygulamış oluyoruz. Bu, ana while döngümüzün saniyede verdiğimiz FPS değeri(burada 50 vermiştik) kadar dönmesini, dolayısıyla ekranın da o sayıda yenilenmesini sağlıyor. Ayrıca bu FPS değeri, programınızın çalışma hızını da doğrudan etkiler. Mesela, bir araba ekranın uçları arasında 2 saniyede dolaşıyorsa FPS değerini 2 katına çıkardığımızda 1 saniyede dolaşmış olur.

  4. satırda programın kapatma tuşuna basıldığında değeri True olacak bir değişken tanımlayıp ona kapat ismini verdik. Dolayısıyla 14. satırdaki while döngüsü bu değişken False olduğu sürece açık kalacak. Bunun kontrolünü de 15-17. satırlar arasında yaptık. Kodlarda ayrıca belirtilen bu kısmı daha detaylı inceleyelim.

pygame.event.get() ile kullanıcının yaptığı her şeyi(imlecin o anki konumu, tıklamalar, klavyeden basılı tuşlar gibi) bir soraki döngüye kadar kaydeder. Buradaki for döngüsü ile bu kayıtlar arasında çıkış olup olmadığını if yapısı yardımıyla kontrol ettik. Eğer çıkış yapıldıysa, while döngüsünden çıkılabilsin diye kapat değişkenine True değerini verdik.

Aradaki yorum satırları yazacağınız oyuna göre değişebilir. 24. satırda ise ekranın yenilenebilmesi için gerekli kodumuzu yazdık. Bu da pygame ile yaptığımız tüm uygulamalarda yer alacak.

 
comments powered by Disqus