Tekst i czcionki

Wczytywanie czcionek


Zanim będziesz mógł wyświetlić tekst, będziesz musiał ustawić mu jakąś czcionkę. Czcionki są zawarte w klasie sf::Font (hermetyzowane) i zawierają 3 główne cechy: wczytywanie czcionek, pobieranie glifów (wizualna reprezentacja liter) oraz odczytywanie atrybutów czcionek.

Skupmy się na najbardziej popularnym wczytywaniem czcionek, czyli wczytywaniem z pliku:

Zauważ, że SFML nie wczytuje czcionek systemowych automatycznie, a więc coś takiego font.loadFromFile(„Courier New”) nie zadziała, ponieważ SFML potrzebuje nazwy pliku, nie nazwy czcionki oraz program nie znajdzie się w magiczny sposób do folderu z czcionkami w twoim systemie. Jeżeli chcesz wykorzystać jakąś to musisz ją dostarczyć razem z resztą plików potrzebnych do twojej gry.

Czasami SFML ma problemy z czcionkami z pozornie nie oczywistych powodów. Wtedy pierwszym z błędów, które sie pojawiają to komunikat w konsoli: „unable to open file”. Upewnij się  czy podałeś prawidłową ścieżkę do pliku (używaj ścieżek bezpośrednich) oraz z dobrym rozszerzeniem pliku. Jeżeli jesteś pewien że nazwa jest poprawna to zauważ że w przypadku gdy uruchamiasz grę z poziomu IDE to ścieżka bezpośrednia zaczyna się tam gdzie jest kod programu (zazwyczaj), a gdy uruchamiasz ją z pliku wykonywalnego (exe) to ścieżka bezpośrednia rozpoczyna się tam gdzie jest plik exe.

Czcionkę możesz wczytać także z pamięci (loadFromMemory) lub własnego strumienia danych (loadFromStream).

SFML wspiera najczęściej spotykane rozszerzenia czcionek, pełna lista jest dostępna w dokumentacji API.

 

Wyświetlanie tekstu


Do rysowania tekstu używamy klasy sf::Text i jest bardzo prosta w użyciu:

Tekst może także ulegać przekształceniom (transform) posiada pozycję, rotację i skalę. Funkcje są w większości takie same jak dla sf::Sprite i działają na tej samej zasadzie, wszystko jest wyjaśnione w poradniku o Przekształcaniu obiektów.

 

Rozwiązywanie problemów ze znakami nienależącymi do ASCII


Prawidłowe przechwytywanie znaków, które nie należą do ASCII może być dla nas (europejczyków) może być dosyć istotne, ale jest dosyć trudne. Wymaga to dobrej wiedzy kodowania podczas interpretacji danych znaków. Istnieje dosyć proste rozwiązanie: należy skorzystać z wide literal string (wybaczcie, ale nie wiem jak to ładnie przetłumaczyć). Wygląda to w następujący sposób:

Dodając to L przed tekstem dajemy kompilatorowi informację, że chcemy skorzystać z szerokich znaków. Generalnie to rozwiązanie nie pomaga jeżeli chodzi o niektóre znaki, ale w przypadku polskich czcionek daje sobie radę.

 

Tworzenie własnych klas do obsługi tekstu


 Jeżeli sf::Text ma twoim zdaniem zbyt dużo ograniczeń, albo po prostu jest dla ciebie zbyt słabo rozbudowany możesz stworzyć własną klasę obsługującą tekst. Wszystko czego potrzebujesz do stworzenia własnej klasy znajduje się w sf::Font.

Po pierwsze musisz pobrać teksturę, któa zwiera wszystkie pre-renderowane glify o określonym rozmiarze:

Zauważ, że glify są dodawane dopiero podczas gdy jest pobierana tekstura, jest to spowodowane dużą ilością znaków (więcej niż 100000) i dlatego nie są wczytywane podczas wczytywania czcionki, zamiast tego są wczytywane podczas uruchomienia getGlyph (zobacz poniżej).

Aby zrobić coś użytecznego z teksturą glifa musisz pobrać jej koordynaty, które są zawarte w:

character to kod UTF-32 glifa, którego chcesz pobrać. Musisz także podać wielkość znaków oraz to czy znaki mają być pogrubione czy normalne.

sf::Glyph posiada 3 członków:

  • textureRect zawiera współrzędne glifu,
  • bounds ograniczający prostokąt glifa, który pomaga w ustawieniu go w stosunku do linii bazowej tekstu,
  • advance to poziomy offset, który ma na celu pobranie następnego glifa w tekście.

Wreszcie możesz pobrać kilka właściwości twojego tekstu, takie jak wysokość linii czy kerning.

Oryginalny artykuł