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:
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:
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++:
Podstawy obsługi plików.
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:
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):
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:
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
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow oknoAplikacji( sf::VideoMode( 640, 480, 32 ), "Kurs SFML - http://cpp0x.pl" );
sf::Texture tekstura;
tekstura.loadFromFile( "box.jpg" );
sf::Sprite obrazek;
obrazek.setTexture( tekstura );
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 );
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.