Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Biblioteki C++

Okno renderujące grafikę

[lekcja] Rozdział 8. Omówienie klasy sf::RenderWindow dedykowanej do renderowania grafiki 2D w bibliotece SFML 2.0. Ponadto omówienie klasy sf::Color służącej do nadawania kolorów.

Wprowadzenie

Choć niestety nadal nie wiesz jak narysować cokolwiek na ekranie, to mimo wszystko wiedza, która została przedstawiona do tej pory jest niezbędna do tworzenia gier. Prawie na samym początku niniejszego kursu omawialiśmy klasę sf::Window, która służyła nam do tworzenia okna aplikacji. Klasa sf::Window jest użyteczna wtedy, gdy chcemy całkowicie samodzielnie zarządzać oknem. Jeżeli chcemy korzystać z możliwości wbudowanych w bibliotekę SFML 2.0 to warto wówczas skorzystać z klasy sf::RenderWindow, która jest dedykowana do renderowania grafiki 2D przy pomocy mechanizmów OpenGL.

Klasa sf::RenderWindow dziedziczy klasę sf::Window dzięki czemu posiada wszystkie cechy i własności klasy sf::Window. Ponadto została ona dodatkowo rozszerzona o nowe możliwości, w tym wsparcie do renderingu grafiki 2D. W związku z tym, że klasa sf::RenderWindow dziedziczy po klasie sf::Window, sposób tworzenia i obsługi okna pozostaje więc ten sam. Jedyne co się w praktyce zmieniło w budowie aplikacji to nazwa klasy tworzącej okno tj. zamiast sf::Window w kodzie będzie występowała klasa o nazwie sf::RenderWindow.

Wymagany plik nagłówkowy

Jak już wiemy, klasa sf::RenderWindow jest dedykowana do renderowania grafiki 2D. Aby móc korzystać z klasy sf::RenderWindow najlepiej dołączyć następujący plik nagłówkowy:
C/C++
#include <SFML/Graphics.hpp>
Powyższy plik nagłówowy dołącza nie tylko klasę sf::RenderWindow, ale również udostępnia nam cały szereg innych narzędzi wykorzystywanych przy pisaniu gier, takich jak np. wczytywanie plików graficznych, rysowanie sprajtów czy też obsługa czcionek. Można oczywiście bawić się w dołączanie tylko niezbędnych plików do skompilowania projektu, niemniej jednak w przypadku biblioteki SFML nie ma to większego sensu, bowiem zazwyczaj korzysta się z większości komponentów należących do modułu graficznego.

Efekt uboczny zastosowania nowej klasy

Jeżeli podmieniłeś w aplikacji, którą do tej pory pisaliśmy klasę sf::Window na klasę sf::RenderWindow to zapewne zauważyłeś, że ekran okna stał się kolorowy, a dokładniej wypełniony pikselami losowych kolorów. Dzieje się tak, bowiem została przydzielona pamięć dla okna renderującego, jednak pamięć ta nie została niczym przez nas zainicjalizowana, więc zawiera tzw. 'śmieci'. Śmieci można się pozbyć poprzez zwykłe zapełnienie ekranu jakąś grafiką, bądź poprzez wyczyszczenie ekranu.

Jeżeli nie dostałeś efektu opisanego w niniejszym paragrafie to nic się nie stało - u siebie nie zaobserwowałem tego efektu, niemniej jednak w oficjalnym anglojęzycznym kursie, omawiającym poprzednią wersję biblioteki SFML zwracano na to uwagę. Tym samym postanowiłem wspomnianą informację również przytoczyć :)

Czyszczenie ekranu

Czyszczenie ekranu nie wymaga od nas specjalnej filozofii - jak już pisałem na początku klasa sf::RenderWindow rozszerza możliwości klasy sf::Window. Jednym z rozszerzeń jest metoda clear, która umożliwia czyszczenie ekranu na dowolny kolor. Domyślnym kolorem na który ekran zostanie wyczyszczony przez wspomnianą metodę jest kolor czarny. Jeżeli chcemy aby ekran został wyczyszczony na inny kolor to musimy podać poprzez argument metody clear kolor na jaki chcemy by został ekran zamalowany. W praktyce będzie więc to wyglądało tak:
C/C++
oknoAplikacji.clear(); //Wyczyści scenę na kolor czarny

oknoAplikacji.clear( sf::Color( 255, 0, 0 ) ); //Wyczyści scenę na kolor czerwony

Klasa sf::Color

Jak widać przy czyszczeniu ekranu pojawiła się nowość pt. sf::Color. sf::Color jest w rzeczywistości klasą, która umożliwia nam nadanie koloru tła za pomocą składowych RGBA. RGBA to skrót od: Red, Green, Blue, Alpha. Z angielskiego na nasze są to następujące składowe koloru: czerwony, zielony, niebieski i kanał przezroczystości. Kanał przeźroczystości nie został podany w przykładzie - domyślnie wynosi on 255, czyli podany kolor ma posiadać 100% krycie powierzchni (inaczej mówiąc: nic nie ma prześwitywać spod spodu). Każda składowa koloru jest wyrażona przez 8 bitową liczbę, co w praktyce oznacza, że minimalną wartością dla składowej koloru jest 0, a maksymalną jest 255. Stąd uzyskaliśmy intensywne czerwone tło w drugim przykładzie, który czyścił tło. W bibliotece SFML wszystkie barwy ustawiamy za pośrednictwem tej klasy. Dzięki temu nie musimy się przejmować o szczegóły techniczne związane poprawnym wsparciem dla barw w trybie 16bitowym - ta klasa zapewnia nam po prostu komfort pracy, w której myślimy zawsze w jednolity sposób: Mamy 32bitowy opis koloru - 8 bitów na każdą składową: R, G, B oraz A.

Przykład

C/C++
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Kurs SFML - http://cpp0x.pl" );
    while( oknoAplikacji.isOpen() )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Middle )
                 oknoAplikacji.close();
           
        }
        oknoAplikacji.clear( sf::Color( 255, 0, 0 ) );
        oknoAplikacji.display();
    }
    return 0;
}

Podwójne buforowanie w SFML

Jeżeli znasz inne biblioteki wykorzystywane do tworzenia gier, a SFML jest kolejną z nich, którą zdecydowałeś się poznać to zapewne nie raz przewijał się tam wątek podwójnego buforowania. W SFML-u podwójne buforowanie jest zaszyte w oknie renderującym, więc nie musimy wykonywać żadnych dodatkowych kroków, by ekran nam nie mrugał. Naszą scenę tworzymy więc na buforze, którego zawartość jest automatycznie kopiowana na ekran w chwili wywołania metody display, należącej do klasy okna renderującego sf::RenderWindow.

Co to jest podwójne buforowanie?

Jeżeli nie jesteś obyty w świecie tworzenia gier to zapewne hasło pt. 'podwójne buforowanie' nic Ci nie mówi. Podwójne buforowanie polega na utworzeniu dodatkowego bufora pamięci o wymiarach okna, przeznaczonego do rysowania całej sceny gry. Po narysowaniu całej sceny kopiuje się zawartość wspomnianego bufora na ekran. Zabieg ten stosuje się w celu zapobiegania występowania nieprzyjemnych efektów, które pojawiają się  podczas nanoszenia obiektów bezpośrednio na ekran. Dzięki temu aplikacje są przyjemne dla oka i nie mrugają nam co i rusz podczas czyszczenia każdej klatki i budowania jej od początku na oczach użytkownika.

Podsumowanie

W niniejszym rozdziale nauczyłeś się, w jaki sposób tworzy się okno przystosowane do wyświetlania sceny gry. W kolejnych rozdziałach sukcesywnie będą omawiane mechanizmy związane z obsługą sceny, a więc to na co prawdopodobnie czekałeś od chwili rozpoczęcia nauki biblioteki SFML 2.0.
Poprzedni dokument Następny dokument
Bezpośredni dostęp do klawiatury, myszy i joysticka Wczytywanie tekstur i rysowanie sprajtów