Basit ve Hızlı Çokluortam Kütüphanesi (Simple and fast Multimedia Library, SFML), son zamanlarda özellikle bağımsız oyun geliştiricileri, hobi geliştiriciler ve çoklu ortam (sanal gerçeklik, görsel sanatlar vb.) geliştiricileri arasında popülerlik kazanmıştır.

Bu kütüphane ile bilgisayara iki ya da üç boyutlu görseller çizdirmek; ogg, wav, aiff gibi birçok formatta ses dosyaları yürütmek, internet üzerinden soket bağlantıları kurmak ve genel uygulama yönetimi yapmak oldukça basitleştirilmiştir. Bu özelliklerinin yanısıra C++ ile yazılmış, modern standartlarda OpenGL kullanan, nesne tabanlı, açık kaynak kodlu bir kütüphane olması da birçok insanın bu kütüphaneyi kullanmayı seçmesinde etkili olmuştur.

Yazımda bu kütüphane ile basit bir görsel uygulama yapımını öğretecek, genel SFML yapısını somut temeller ve örnekler üzerinden anlatacağım. Ancak C++ ve programlamaya dair ayrıntılara girmeyeceğim, yani ortalama bir programlama bilginizin olduğunu varsayıyorum. Herkes hazırsa başlıyoruz!

Uygulama Penceresi

SFML nesne tabanlı olduğundan dolayı farklı görevler için farklı nesneler kullanılmakta. Bu nesnelere yeri geldikçe değinecek, görevlerinden bahsedeceğim. Bu bölümde işletim sistemiyle etkileşimde bulunan, uygulamamız için pencere açılmasını ve bu pencerenin yönetimini sağlayan sf::RenderWindow nesnesinden bahsedeceğim.

// SFML penceresini baslatma
sf::RenderWindow app(sf::VideoMode(800, 600, 32), "Cclub SFML");

Yukarıdaki kod parçasında SFML'e, “Cclub SFML“ adında; yatayda 800 piksel, dikeyde 600 piksel boyutunda, 32bit renk derinliğinde bir pencere açmasını söylüyoruz ve bu pencereyi, “app” adında bir değişkende saklıyoruz. Bu değişkeni uygulamanın tabanı olarak düşünebiliriz. Bütün etkileşimler, olaylar ve program verilerine bu değişken üzerinden ulaşacağız.

Resim Yükleme

Resim ögeleri iki nesnede değerlendirilebilir. Birincisi sf::Image nesnesidir ve bu nesne, programa resim verisi yüklemeye ve yönetmeye yarar; ancak bu nesne ekrana çizilemez. SFML'de resim ögelerinin çizilebilmesi için sf::Sprite nesnesinden türetilmiş olmaları gerekir; ki bu da bahsedeceğimiz ikinci nesnedir.

sf::Image nesnesi bir sf::Sprite nesnesinin oluşturulmasında kullanılır ve sf::Sprite nesnesine ekrana çizilecek piksellerin bilgisini iletir.

// yildiz isimli bir resim dosyasini programa yukle
            sf::Image resim;
            resim.LoadFromFile("yildiz.png");

            // resim verisini kullanarak gorsel adında bir sf::Sprite olustur
            sf::Sprite gorsel(resim);

Burada oluşturduğumuz gorsel değişkeni uygulamada ekrana çizeceğimiz grafikleri içeriyor. Bu değişkenle çizilecek grafiklerin ekrandaki konumunu, açısını, saydamlığını ve daha birçok özelliğini belirtebiliriz:

// gorselin sirayla rengini, konumunu ve boyutunu degistirme
            gorsel.SetColor(sf::Color(0, 255, 255, 128));
            gorsel.SetPosition(200.f, 100.f);
            gorsel.SetScale(2.f, 2.f);

Ana Uygulama Döngüsü

Çoğu etkileşimli uygulamada olduğu gibi, SFML'de başlangıç işlemleri tamamlandığında – yani görseller yüklendikten, pencere açıldıktan ve diğer tek seferlik işlemlerden sonra- büyük bir döngü içerisinde çalışır ve bu döngü uygulama kapatılana kadar sürer. Bu yapı bilgisayarın işlem gücüne göre dalgalanan bir hızla döner ve her döngünün sonunda uygulamamızın görselleri ekrana çizilir.

Bu döngüyü oluşturmamız SFML ile oldukça basit. Bir while döngüsüyle bu yapıyı sağlayabiliriz:

// uygulama dongusunu baslat, acik oldugu surece don
            while (app.IsOpened())
            {
            // uygulama etkilesim kodu buraya...
            }

Ancak uygulamayı bu halde bırakırsak asla kapanmayacaktır. Bu nedenle SFML olay yönetim becerilerinden yararlanacağız ve yukarıdaki koda uygulamanın kapatılma komutuyla gelen durumu yöneten bir parça ekleyeceğiz.

// uygulama dongusunu baslat acik oldugu surece don
            while (app.IsOpened())
            {
                sf::Event olay;
                while (app.GetEvent(olay))
                {
                    // uygulama kapatma komutunu dinle
                    if (olay.Type == sf::Event::Closed)
                        app.Close();
                }
                // uygulama etkilesim kodu buraya...
            }

Bu haliyle uygulamamız pencere kapatıldığında while döngüsünden çıkacak ve uygulama temizce kapatılacaktır. Bu noktada sf::Event nesnesinden bahsetmek istiyorum. Bu nesneyle uygulamamıza gelen olayları(event) takip edebilmekteyiz. Bunlara fare tıklamaları, klavye tuşlarına basılması gibi örnekler verilebilir. Bu olayları uygulamanın ana döngüsünde dinleyerek, uygulamanın kullanıcı ve işletim sistemiyle etkileşimini yönlendirebilmekteyiz.

Görsel Komutlar

Uygulamamızı bu haliyle çalıştıracak olursak çok da bir şey yapmadığını göreceğiz. Bunun nedeni henüz SFML'e görsellerin çizilmesiyle ilgili komutlar vermiyor olmamız. O zaman uygulamamızın ana döngüsüne çizim komutlarını ekleyelim;

// Ekran pixellerini sifirla
            app.Clear();

            // gorsel'i ciz
            app.Draw(gorsel);

            // cizilenleri ekranda goster
            app.Display();

Bu komutlarla daha önce programa yüklediğimiz görseli ekrana çizdiriyoruz. Bu komutlar bir döngüde olduğu için uygulamamızın hızına göre sürekli olarak işleneceklerdir. Dolayısıyla bu görsel ile bir etkileşim tasarlamak istersek uygulamamızın hızını hesaba katmamız gerekir.

SFML'de uygulamanın yenilenme sıklığını öğrenmemiz oldukça basit. Örneğin görselimizi saniyede 20 piksel hızla sağa doğru hareket ettirmek istersek, ana döngüdeki kodumuza küçük bir eklemeyle bunu başarabiliriz.

// gorselin yataydaki konumu
            float x = gorsel.GetPosition().x;

            // uygulamanin yenilenme süresi
            float dt = app.GetFrameTime();

            // gorselin yatay konumu saniyede 20 pixele denk gelecek sekilde arttir
            gorsel.SetPosition(x + 20*dt, 100.f);

Yukarıdaki kodda app.GetFrameTime() komutu, uygulamamızın art arda çizilen iki kare arasında geçen çizim süresini saniye cinsinden edinmemizi sağlar. Bu sayede görselimizi uygulamamızın yenilenme hızından bağımsız olarak yenilemiş oluruz.

Sonuç

Bu yazıda, bu konularda deneyimli olup bu kütüphaneyi henüz deneyememiş olanlar ya da genel olarak görsel uygulama geliştirmeyle ilgilenenler için SFML'i giriş niteliğinde tanıtmaya çalıştım.

Bahsettiğim kütüphane bileşenleri daha geniş çaplı uygulamalar için bir taban niteliğinde olup daha fazlası için SFML'in sitesindeki forumlara, örneklere ve anlatımlara göz atmanız yeterli olacaktır. Ayrıca bu siteden çeşitli derleme ortamlarına özgü ayarları ve kurulum bilgilerini de edinip uygulama geliştirmeye hemen başlayabilirsiniz!