Żeby narysować napis w SFML 3.0, potrzebujemy czcionki -
sf::Font
oraz obiektu typu
sf::Text.
Czcionka (ang. font) definiuje wygląd znaków, takich jak litery, cyfry i symbole.
To właśnie dzięki niej tekst może zostać wyświetlony na ekranie w określonym kroju pisma.
W SFML czcionki reprezentowane są przez klasę
sf::Font. Przed użyciem czcionki należy ją załadować z pliku
za pomocą funkcji
openFromFile()
. Po poprawnym wczytaniu czcionki możemy utworzyć obiekt
sf::Text
,
przekazując do niego czcionkę, treść napisu oraz rozmiar znaków.
Obiekt
sf::Text
oferuje wiele możliwości modyfikacji wyglądu tekstu. Możemy zmieniać jego kolor,
pozycję, obrót, skalę, grubość obramowania czy kolor obramowania. Dzięki temu łatwo dostosujemy wygląd napisów
do potrzeb naszej aplikacji lub gry.
Poniższy przykład prezentuje wczytanie czcionki z pliku systemowego Windows, utworzenie napisu oraz wyśrodkowanie go w oknie aplikacji.
Następnie tekst zostaje narysowany na czarnym tle.
Funkcja
getLocalBounds()
klasy
sf::Text
zwraca obiekt typu
sf::FloatRect
, który zawiera informacje
o lokalnych wymiarach tekstu. Za pomocą pól position i size możemy odczytać położenie oraz szerokość i wysokość obszaru zajmowanego
przez napis. W prezentowanym przykładzie wykorzystujemy szerokość tekstu do obliczenia jego pozycji, dzięki czemu może zostać
wyśrodkowany w oknie aplikacji.
Funkcja
getLineSpacing( characterSize )
klasy
sf::Font
zwraca wysokość pojedynczej linii tekstu
w pikselach dla podanego rozmiaru znaków. Wartość ta uwzględnia odstęp pomiędzy kolejnymi liniami tekstu i jest przydatna
podczas rozmieszczania wielu napisów jeden pod drugim. W naszym przykładzie została użyta do obliczenia pionowej pozycji
tekstu podczas jego centrowania względem okna.
#include <SFML/Graphics.hpp>
#include <iostream>
int main() {
sf::RenderWindow window = sf::RenderWindow( sf::VideoMode( sf::Vector2u( 800u, 600u ) ), "Font and Texts" );
sf::Font font;
if( !font.openFromFile( "C:\\Windows\\Fonts\\arial.ttf" ) ) {
std::cout << "Failed to load font!" << std::endl;
return 0;
}
unsigned int characterSize = 79u; sf::Text text( font, "Hello SFML 3.0", characterSize );
text.setFillColor( sf::Color::Red ); text.setOutlineThickness( 6.f ); text.setOutlineColor( sf::Color( 127, 0, 0 ) ); text.setRotation( sf::degrees( 5.f ) ); sf::Vector2u textPosition;
textPosition.x =( window.getSize().x -( unsigned int )( text.getLocalBounds().size.x ) ) / 2u;
textPosition.y =( window.getSize().y -( unsigned int )( font.getLineSpacing( characterSize ) ) ) / 2u;
textPosition.y -= 47u; text.setPosition( sf::Vector2f( textPosition ) ); while( window.isOpen() ) {
while( const std::optional event = window.pollEvent() ) {
if( event->is < sf::Event::Closed >() )
window.close();
}
window.clear( sf::Color::Black ); window.draw( text ); window.display(); }
return 0;
}