Żadna porządna biblioteka do grafiki 2D nie może obyć się bez narzędzi służących do wypisywania tekstu. Kiedy jednak mamy na uwadze głównie programowanie gier (lub pokrewnych aplikacji), sprawa wygląda nieco inaczej niż w bardziej “ogólnych” zastosowaniach. Nie trzeba na przykład rozkładać tekstu na czynniki pierwsze:
Pozwalałoby to oczywiście w razie potrzeby dodać kursywę, pod-, nad- i przekreślenie. Zazwyczaj jednak nie jest to potrzebne.
Tak więc chociaż wygląda to na krok wstecz, stosuje się najczęściej czcionki bitmapowe. Pomysł polega na tym, że cały używany zestaw znaków danego kroju i danej wielkości jest rysowany na jednej teksturze w taki sposób, by łatwo można było obliczyć pozycję każdego znaku:
Wyświetlanie napisu polega wtedy na renderowaniu oteksturowanych prostokątów – po jednym dla każdego znaku. Jest to bardzo wydajne, bo chociaż trójkątów może być bardzo dużo, to ich tekstura jest zawsze taka sama. Można zatem wyrzucić całe połacie tekstu na ekran tylko jednym wywołaniem Draw[Indexed]Primitive.
Tylko skąd wziąć taką sprytną teksturę? Można rzecz jasna generować ją samemu przy pomocy funkcji GDI; choć jest to wolne, byłoby wykonywane tylko raz, więc nie stanowiłoby problemu. Lepszym rozwiązaniem jest użycie odpowiednich programów, z których najlepszym jest chyba Bitmap Font Generator. Potrafi on w sprytny sposób upakować w jednym obrazku sporą ilość znaków, zaś ich parametry opisuje w łatwym do odczytania formacie tekstowym przypominającym szczątkowy INI.
Obecnie używam więc właśnie jego i dzięki temu mogłem w końcu dodać do swojego silnika podstawowy i zupełnie niezbędny element: licznik FPSów :)
“Lepszym rozwiązaniem jest użycie odpowiednich programów” – nie zgadzam sie :). Wprowadzasz w ten sposob niepotrzebne ograniczenia. Troszke wiecej posiedzisz przy projektowaniu i generujac czcionke masz duzo bardziej elastyczny system.
Naturalnie najlepiej mieć obie opcje – zresztą drugą zawsze mogę dodać :) Ale pytanie brzmi: jak często pojawiają się sytuacje wymagające generowania czcionki, czyli np. dynamiczna zmiana wielkości znaków.
Pytanie brzmi, jak czesto pojawiaja sie sytuacje gdzie potrzebujemy tak upchane fonty :) Ja generuje czcionke z wykorzystaniem freetype’a i caly potrzebny zestaw znakow miesci sie z grubym zapasem.
SirMike: m.in. Do tego umozliwiasz pisanie w wzasadzie kazdym jezyku zerowym kosztem i jak np chinczyk bedzie gral z kumplami w twoja gre to moga sobie pisac krzaczkami itp. A w dodatku wykorzystujesz tylke te litery ktore naprawde potrzebujesz i nie marnujesz miejsca na caly pozostaly syf(jak napisal SirMike).