« Wczytywanie tekstur i rysowanie sprajtów, lekcja »
Rozdział 9. Wczytywanie tekstur do pamięci karty graficznej oraz ich rysowanie na scenie przy pomocy klasy sf::Sprite. (lekcja)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!
Autor: Piotr Szawdyński
Kurs SFML 2.x, C++

Wczytywanie tekstur i rysowanie sprajtów

[lekcja] Rozdział 9. Wczytywanie tekstur do pamięci karty graficznej oraz ich rysowanie na scenie przy pomocy klasy sf::Sprite.

Wprowadzenie

Interfejs modułu graficznego biblioteki SFML 2.0 uległ znacznym modyfikacjom w stosunku do wersji 1.6. Wprowadzone zmiany w module graficznym między wspomnianymi wersjami są na tyle duże, że praktycznie trzeba się jego uczyć na nowo. Zanim jednak przejdziemy do właściwej części rozdziału warto teraz wspomnieć o wspieranych formatach plików graficznych przez bibliotekę SFML 2.0. Biblioteka SFML 2.0 obsługuje takie formaty plików graficznych jak: bmp, dds, jpg, png, tga oraz psd. Korzystanie z wymienionych formatów plików graficznych nie wymaga z naszej strony wielkiego wysiłku - można wręcz powiedzieć, że obsługę tych formatów uzyskujemy minimalnym możliwym kosztem, jednak o szczegółach dowiesz się w dalszej części niniejszego rozdziału.

Klasa sf::Texture

Zanim zaczniemy wyświetlać obrazki na ekranie, należy najpierw poznać sposób wczytywania obrazków do pamięci. W bibliotece SFML 2.0 istnieją dwie klasy, które umożliwiają wczytywanie obrazków. Tymi klasami są sf::Image oraz sf::Texture. Obie klasy mają jednak różne zastosowanie. Pierwsza z nich, tj. sf::Image służy przede wszystkim do modyfikowania wyglądu obrazka oraz jego zapisywania. Klasa ta od wersji SFML 2.0 nie jest już wykorzystywana do wyświetlania sprajtów, więc w praktyce nie będzie Ciebie ona interesowała przez bardzo długi czas nauki omawianej biblioteki. Druga klasa, tj. sf::Texture została wprowadzona wraz z wersją SFML 2.0. Klasa ta umożliwia między innymi wczytywanie tekstur z pliku do pamięci karty graficznej. Dzięki temu, że tekstura trafia do pamięci karty graficznej, możliwe jest wykorzystanie pełnych możliwości sprzętowych karty graficznej we wszelkich operacjach związanych z renderowaniem wczytanej tekstury.

Wczytywanie tekstury

Klasa sf::Texture umożliwia wczytanie tekstury do pamięci karty graficznej na kilka sposobów. My skupimy się na najprostszym przypadku tj. na wczytywaniu tekstury bezpośrednio z pliku. Zanim to jednak zrobimy, należy utworzyć obiekt do przechowywania tekstury:
C/C++
sf::Texture tekstura;
Następnie wystarczy wywołać metodę loadFromFile, gdzie pierwszy argument omawianej metody określa ścieżkę i nazwę pliku graficznego. Wczytanie tekstury do pamięci karty graficznej sprowadza się więc do następujących linijek kodu:
C/C++
sf::Texture tekstura;
tekstura.loadFromFile( "obrazek.png" );
Metoda loadFromFile zwraca wartość logiczną true w przypadku, gdy wczytanie tekstury się powiodło, natomiast false w przypadku niepowodzenia. Pisząc własną aplikację warto zadbać o to, aby zwracane wartości były obsłużone właściwie. W kursie jednak dąży się do maksymalnego upraszczania kodu, a więc rzadko kiedy przykłady będą zawierały obsługę błędów.

Ścieżka do plików graficznych

Podając samą nazwę pliku graficznego należy mieć świadomość, że będzie on szukany w katalogu roboczym aplikacji. Jeżeli termin ten nie za wiele Ci mówi, zapoznaj się z lekcją kursu C++: » Kurs C++ » Poziom 4Podstawy obsługi plików lekcja.

Rysowanie sprajta na scenie

Nadszedł czas na rysowanie obrazków na ekranie. W bibliotece SFML rysowane obrazki nazwano sprajtami. Do rysowania sprajtów na scenie służy klasa sf::Sprite, która dostarcza nam wygodny interfejs do zarządzania obrazkiem. Zanim jednak dowiemy się w jaki sposób wyświetla się obrazek, skupmy się najpierw na podstawach związanych z konfiguracją sprajta.

Konfigurowanie obiektu sf::Sprite

No to zaczynamy :) W pierwszej kolejności tworzymy obiekt typu sf::Sprite:
C/C++
sf::Sprite obrazek;
W kolejnym kroku informujemy nowo utworzony obiekt, jaka tekstura powinna zostać użyta podczas rysowania sprajta. Do tego celu służy metoda setTexture, która jako pierwszy argument przyjmuje obiekt reprezentujący teksturę (czyli obiekt typu sf::Texture):
C/C++
obrazek.setTexture( tekstura );
Następnie moglibyśmy określić położenie obiektu na scenie, kąt obrotu oraz jego rozmiar, jednak na chwilę obecną pozostawimy wartości domyślne, aby skupić się na najważniejszych elementach związanych z rysowaniem sprajta.

Umieszczanie obiektu sf::Sprite na scenie

Ostatnim, a zarazem najważniejszym dla nas krokiem jest narysowanie sprajta na scenie. Do tego celu wykorzystuje się metodę draw, która występuje w klasie sf::RenderWindow. Za pomocą wspomnianej metody rysuje się wszystkie obiekty na scenie w jednakowy sposób:
C/C++
oknoAplikacji.draw( obrazek );
Metoda draw jako pierwszy argument przyjmuje obiekt, który posiada interfejs sf::Drawable. W związku z tym, że wszystkie klasy, które służą do rysowania czegoś na scenie dziedziczą po interfejsie sf::Drawable, możliwe jest rysowanie wszystkiego na scenie przy pomocy omawianej metody tj. metody draw.

Przykład

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

int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 640, 480, 32 ), "Kurs SFML - http://cpp0x.pl" );
   
    sf::Texture tekstura; //INFO: dopisane w tym rozdziale
    tekstura.loadFromFile( "box.jpg" ); //INFO: dopisane w tym rozdziale
   
    sf::Sprite obrazek; //INFO: dopisane w tym rozdziale
    obrazek.setTexture( tekstura ); //INFO: dopisane w tym rozdziale
   
    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::Black );
        oknoAplikacji.draw( obrazek ); //INFO: dopisane w tym rozdziale
        oknoAplikacji.display();
    }
    return 0;
}

Podsumowanie

W niniejszym rozdziale nauczyłeś się w jaki sposób wczytuje się tekstury do pamięci karty graficznej oraz jak wyświetlać sprajty na scenie. Następny rozdział będzie omawiał kolejne aspekty związane ze sprajtami w bibliotece SFML 2.0.
Poprzedni dokumentNastępny dokument
Okno renderujące grafikęPrzemieszczanie, skalowanie i obracanie sprajtów