14.07.2026 17:34

Moonlight Animate — chiński, japoński i koreański w tekście gry

⏱️ 3 min czytania
Udostępnij:

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.

📚 Powiązane posty

14.07.2026 22:19

Silnik gier: od szablonu do grywalnej gry RPG top-down

Startowy szablon silnika gier to teraz kompletny, grywalny wycinek gry RPG top-down: chodzenie po siatce, rozmowy z postaciami, przeciwnik goniący gdy...
Czytaj dalej →
14.07.2026 19:16

Moonlight Animate — system dialogów w grach

Silnik gier 2D w Moonlight Animate ma teraz kompletny system dialogów: kwestie z efektem maszyny do pisania, wybory z warunkami, zmienne fabularne i g...
Czytaj dalej →
14.07.2026 18:40

Moonlight Animate: ruchoma panorama dźwięku także w wyeksportowanym wideo

Dźwięk przejeżdżający z lewego do prawego głośnika brzmiał dobrze w podglądzie, ale eksport przez serwer zamrażał go w miejscu. Ostatnia luka parytetu...
Czytaj dalej →

📧 Bądź na bieżąco!

Zapisz się na listę oczekujących, aby otrzymywać powiadomienia o nowych postach na Dev Blog oraz informacje o starcie platformy Moonlight.