Moonlight Animate — chiński, japoński i koreański w tekście gry
Poprzednim krokiem silnik gier 2D w Moonlight Animate nauczył się polskiego i języków europejskich. Teraz idzie znacznie dalej: tekst w grze mówi po chińsku, japońsku, koreańsku i w innych pismach. To ostatni brakujący element wielojęzycznego tekstu, zanim zabierzemy się za system dialogów.
Dlaczego CJK to inny problem niż polski
Polski alfabet to kilkadziesiąt znaków — można je przygotować wszystkie z góry. Pismo chińskie, japońskie i koreańskie to dziesiątki tysięcy znaków. Nie da się ich upiec zawczasu — zabrakłoby miejsca w pamięci karty graficznej. Potrzebne było inne podejście.
Atlas liter budowany na żądanie
Silnik trzyma teraz jeden zbiór liter o stałym rozmiarze i dorysowuje do niego znak dopiero wtedy, gdy jest po raz pierwszy potrzebny. Gdy miejsce się kończy, najdawniej używane znaki ustępują nowym (a te używane w bieżącej klatce są chronione, żeby napis nigdy nie „mrugnął"). Dzięki temu gra może wyświetlić dowolny znak z dowolnego pisma, płacąc pamięcią tylko za te faktycznie użyte na ekranie.
Łańcuch czcionek
Tekst rzadko jest w jednym piśmie — nazwa po angielsku, dialog po japońsku, liczby, symbole. Silnik dostał łańcuch czcionek: czcionkę podstawową (dla alfabetu łacińskiego) i czcionki zapasowe (dla CJK i symboli). Dla każdego znaku wybierana jest pierwsza czcionka, która naprawdę go rysuje — z pominięciem takiej, która „zna" znak, ale nie ma jego kształtu. Czcionkę azjatycką dostarcza gra (podaje ją w swoim pliku projektu), bo takie czcionki ważą wiele megabajtów i nie ma sensu wbudowywać ich w silnik.
Szerokość znaków
Znaki CJK są „pełnej szerokości" — zajmują mniej więcej dwa razy tyle co litera łacińska. Silnik uwzględnia to przy układaniu tekstu, więc ramki napisów i zawijanie wierszy dopasowują się poprawnie do japońskiego czy chińskiego zdania, a nie ściskają go w za wąskie pole.
Solidność
Ten fragment przeszedł ostry przegląd, który wychwycił i naprawił kilka realnych pułapek: kolejność wysyłania liter do karty graficznej (żeby świeżo dorysowany znak nie zniknął w pierwszej klatce), odporność na uszkodzoną czcionkę (spreparowany plik nie wywraca już silnika nieskończoną wartością), pomijanie czcionki, która ma znak w spisie, ale bez kształtu, oraz zwalnianie pamięci przy przełączaniu projektów. Rdzeń — siatka liter, kolejność zwalniania miejsca, dobór czcionki — jest pokryty automatycznymi testami.
Zakres i co dalej
Silnik rasteryzuje kształty konturowe — obsługuje więc pisma azjatyckie i monochromatyczne symbole. Kolorowe emoji oraz pisma wymagające „sklejania" znaków (jak arabskie) to osobny, przyszły temat. Najbliższy kierunek jest już blisko: mając wielojęzyczny tekst, budujemy system dialogów — kwestie, rozmowy i wybory w grach fabularnych składanych w całości w Moonlight Animate.