SFML ve Python

Bu ders aracılığıyla SFML'nin Python bağlayıcısının nasıl derleneceğini, kurulacağını ve kullanılacağını öğrenebilirsiniz.


Yeni Python Bağlayıcısı
SFML 2 ile birlikte PySFML 2 isminde yeni bir Python bağlayıcısı geliştirilmeye başlandı. Daha önceki resmi bağlayıcıysa artık geliştirilmiyor.

Bastien'in geliştirmekte olduğu bu yeni bağlayıcı Python için C eklentileri yazmayı kolaylaştıran bir dil olan Cython ile kodlanıyor. Her ne kadar henüz resmi sürüm çıkmamış olsa da SFML 2'deki değişikliklere göre PySFML 2'da güncellemeler yapılıyor. Daha geniş bilgi için SFML forumlarındaki şu başlığa veya PySFML 2'nun GitHub üzerindeki proje sayfasına bakabilirsiniz.


Python Bağlayıcısının Kurulumu
PySFML 2 kısa bir süre önce Happy Kitty üzerinde Pardus için paketlendi. Pardus kullanıyorsanız PySFML 2'yu kolayca yükleyip kullanmaya başlayabilirsiniz. Arch kullanıcıları da AUR üzerinden yükleme yapabilir. Diğer dağıtımlar ve işletim sistemlerinde nasıl kurulum yapılacağını da PySFML 2'nun kurulum belgesinden öğrenebilirsiniz.


Pencere Oluşturmak
PySFML'de pencereler sf.RenderWindow sınıfıyla oluşturuluyor. Bu sınıf pencerimizi doğrudan oluşturmak için bazı yararlı yapıcılar sunmaktadır. Örnek bir kullanım aşağıdaki gibidir:
window = sf.RenderWindow(sf.VideoMode(800, 600, 32), 'PySFML Penceresi')
Burada pencerimizi temsilen window isminde yeni bir değişken oluşturuyoruz. Kullanılan paremetreleri şu şekilde açıklayabiliriz:
  • Kullanılan ilk parametre sf.VideoMode ve pencere için seçilen video kipini belirtiyor. Yukarıdaki örnekte 800x600 piksel büyüklüğünde ve 32 bit derinliğinde bir pencere için değerler görülüyor.
  • İkinci parametreyse pencere başlığıdır.
Pencereyi daha sonra oluşturmak veya farklı parametrelerle tekrar oluşturmak isterseniz sf.RenderWindow.create() metodunu kullanabilirsiniz:
window.create(sf.VideoMode(800, 600, 32), 'PySFML Penceresi');
Yapıcı ve sf.RenderWindow.create() metodu ayrıca iki ek paremetre daha almaktadır. Bunlardan biri pencerenin stilini ayarlamak ve diğeri de daha gelişmiş grafik seçeneklerini ayarlamak içindir. Gelişmiş grafik ayarlarına bu derste fazla değinilmeyecektir. Stil parametresiyse sf.Style bayraklarının (None, Titlebar, Resize, Close ve Fullscreen) bir kombinasyonu olabilir. Öntanımlı değer Resize | Close'dur.
# Bu tam ekran bir pencere oluşturur
window.create(sf.VideoMode(800, 600, 32), 'PySFML Penceresi', sf.Style.FULLSCREEN);

Video Kipleri
Yukarıdaki örnekte video kipi için fazla düşünmedik çünkü pencere kipinde çalışıyorduk, her boyut sorunsuzca kullanılabilir. Fakat tam ekran kipinde çalışmak istiyorsak yalnızca desteklenen kiplerden birini seçmeliyiz. sf.VideoMode.get_fullscreen_modes() sınıf metodu tüm desteklenen tam ekran kiplerinin listesini döndürmektedir. Listedeki öğeler en iyiden en kötüye doğru sıralanmaktadır, böylece sf.VideoMode.get_fullscreen_modes()[0] her zaman en yüksek kaliteli kip olur:
window = sf.RenderWindow(sf.VideoMode.get_fullscreen_modes[0], 'PySFML Penceresi', sf.Style.FULLSCREEN)
Pencere kipini seçmesi için kullanıcıyı özgür bırakıyorsanız, girilen değerleri uygulamadan önce kontrol etmelisiniz. Bunun için sf.VideoMode.is_valid()'i kullanabilirsiniz:
mode = bir_yerlerden_kipi_al() 
if not mode.is_valid():
    # Hata...
Kullanılan masaüstü kipi de sf.VideoMode.get_desktop_mode() sınıf metoduyla elde edilebilir.


Ana Döngü
Oyunumuzun döngü iskeletini yazmaya başlayalım:

# Kurulum kodu
window = sf.RenderWindow(sf.VideoMode(640, 480), 'PySFML Penceresi')
# ... 
while True:
    # Olayları yönet
    # ... 
    window.clear(sf.Color.WHITE)
    # Çizimleri yap
    # ... 
    window.display()

sf.RenderWindow.clear() pencereyi belirtilen renkle doldurur. sf.Color yapıcısıyla özel renk nesneleri oluşturabilirsiniz. Örneğin pembe bir arkaplan istiyorsanız window.clear(sf.Color(255, 192, 203)) yazabilirsiniz. sf.RenderWindow.display() çağrımı ise pencerenin içeriğini günceller.

Yukarıdaki kod pek doğru görünmeyebilir çünkü pencereyi aynı arkaplan rengiyle boyayıp durmak dışında pek bir şey yapmayan bir döngüye sahibiz yalnızca. Endişelenmenize gerek yok, çok yakında biraz daha işe yarar şeyler yazınca daha mantıklı görünmeye başlayacaklar.

Yukarıdaki gibi bir kod parçasını çalıştırıp işlem süreçlerini kontrol ederseniz bu küçük programın işlemciyi %100 olarak kullandığını görebilirsiniz. Bu pek de sürpriz değildir, yazdığımız döngü tam olarak bunu yapmaktadır. Bu durumu düzeltmek için sf.RenderWindow.framerate_limit kullanılabilir:
window.framerate_limit = 60
Bu satır SFML'e pencereyi saniyede 60 defadan fazla güncellememesini söylemektedir.

Aşağıdaki PySFML ile yazılmış örneği inceleyerek öğrendiklerinizi pekiştirebilirsiniz.

#!/usr/bin/python
# -*- coding: utf-8 -*- 
import sf 
def main():
    window = sf.RenderWindow(sf.VideoMode(800, 600),
                             'PySFML Penceresi',
                             sf.Style.FULLSCREEN)
    window.framerate_limit = 60
    running = True
    texture = sf.Texture.load_from_file('python-logo.png')
    sprite = sf.Sprite(texture)
    sprite.origin = (sprite.width / 2, sprite.height / 2)
    sprite.move(window.width / 2, window.height / 2) 
    while running:
        for event in window.iter_events():
            # Uygulama kapandığında veya
            # kullanıcı Escape tuşuna bastığında çalışmayı durdur
            if (event.type == sf.Event.CLOSED or
                (event.type == sf.Event.KEY_PRESSED and
                 event.code == sf.Keyboard.ESCAPE)):
                running = False 
        window.clear(sf.Color.WHITE)
        window.draw(sprite)
        window.display()
    window.close()
if __name__ == '__main__':
    main()

Kısaca SFML'yi Python ile nasıl kullanacağımızı gördük. Daha fazlası için diğer örnekleri inceleyebilir ve UPA belgelerine göz atabilirsiniz.


Kaynaklar