Tarama Pencerelerini Kullanmak

Window paketi, pencereleri ve olayları yönetmek için tam bir sistem sunar, hatta OpenGL kullanmanız için bir arayüzdür de. Peki OpenGL kullanmak istemiyorsanız ne olacak? SFML'nin sadece 2B'ye adanmış graphics paketini kullanabilirsiniz.

graphics paketini kullanmak için yapmanız gereken tek şey SFML/Graphics.hpp başlığını programınıza dahil etmektir. SFML/Window.hpp, graphics paketi tarafından programınıza dahil edileceği için ayrıca sizin de eklemenize gerek yoktur.


Tarama Penceresi
sf::Window ile oluşturulmuş temel SFML penceresinin bir şeylerin çizilmesiyle ilgili en ufak bir fikri dahi yoktur. Gerçekte sf::Window içine graphics paketinden hiçbir şey gösteremezsiniz. graphics paketinin daha fazla özellik içeren sf::RenderWindow isimli bir pencere sınıfı sunmasının nedeni budur. sf::RenderWindow, sf::Window'dan kalıt almaktadır, onun tüm özelliklerini içermektedir ve pencere oluşturma ve olay yönetiminde aynı onun gibi davranmaktadır. Bunlara ek olarak sf::RenderWindow, grafiklerle kolayca iş yapabilmeniz için ek özellikler sunar.

Gerçekte, graphics paketini kullanan bir iskelet uygulamanın window kullanandan pek bir farkı yoktur:

int main()
{
    // Ana tarama penceresini oluştur
    sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Graphics"); 
    // Oyun döngüsüne başla
    while (App.IsOpened())
    {
        // Olayları işle
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            // Pencereyi kapat : çıkış
            if (Event.Type == sf::Event::Closed)
                App.Close();
        } 
        // Ekranı temizle (siyah renkle doldur)
        App.Clear(); 
        // Pencere içeriğini ekranda göster
        App.Display();
    }
    return EXIT_SUCCESS;
}
Belirgin tek fark, Clear'ı çağırmamız, böylece ekranda rastgele pikseller yerine (dersleri takip ettiyseniz, onlardan sıkılmaya başlamış olabilirsiniz), siyah bir görüntü elde edebiliriz. Eğer ekranı farklı bir renkle temizlemeniz gerekirse, Clear fonksiyonunu parametrelerle kullanabilirsiniz:
App.Clear(sf::Color(200, 0, 0));
SFML grafik paketi, renklerle çalışmak için sf::Color isminde kullanışlı bir sınıf sunar. SFML'deki tüm renkler bir sf::Color olmalıdır.

sf::Color, dört 8 bitlik elemana sahiptir r (red / kırmızı), g (green / yeşil), b (blue / mavi) ve a (alpha / alfa). Bu elemanların değeri 0'dan 255'e herhangi bir sayı olabilir. Yukarıdaki kodda kırmızıya 200 ve diğer elemanlara 0 değeri vererek kırmızı renk elde etmiş olduk.

Pencereyi temizlemek zorunlu değildir, eğer çizdirecekleriniz tüm ekranı kaplayacaksa bunu yapmanıza gerek yoktur.


Ekran Görüntüsü Almak
Çoğu oyunda bir tuşa bastığınızda bir dizine ekran görüntüsü kaydedebiliriz, böylece oyundaki ilginç görüntüleri, geçemediğimiz bir bölümü vs. diğerleriyle paylaşabiliriz. sf::RenderWindow da pencere içeriğini resim olarak kaydetmek için bir fonksiyon sunar. CopyScreen ile pencerenin tamamının veya bir kısmının görüntüsü alınarak SaveToFile ile bir resim dosyasına kaydedilebilir veya başka bir iş için kullanılabilir. Örneğin F1 tuşu ile ekran görüntüsü almak için aşağıdaki kod parçasından yararlanabiliriz:
sf::Image Image1; 
if (Event.Key.Code == sf::Key::F1)
{
    Image1.CopyScreen(App);
    Image1.SaveToFile("screenshot.jpg");
}


OpenGL'i de Kullanmak
Elbette sf::RenderWindow'da OpenGL komutlarını kullanmak da mümkündür. İsterseniz SFML çizim komutlarıyla OpenGL komutlarını birlikte istediğiniz gibi kullanabilirsiniz. Bununla birlikte SFML, OpenGL durumlarını öntanımlı olarak saklamaz, eğer bunu kendiniz yapmak isterseniz, PreserveOpenGLStates ile kaydetme, sıfırlama ve geri getirme gibi işlemleri yapabilirsiniz:
App.PreserveOpenGLStates(true);
Bu işlemciyi yoran bir işlemdir ve performansın düşmesine neden olabilir, yalnızca gerçekten ihtiyacınız olduğunda kullanın.

Tarama pencerelerin temellerini gördük, yavaş yavaş biraz daha gelişmiş işlemler için neler yapacağımıza bakmaya hazır hale geliyoruz.



Bu eğitselle ilgili diğer örneklere sfml-gelistirme deposundan ulaşabilirsiniz.


Kaynak: Graphics - Using render windows