W końcu, po tygodniowych wakacjach, zdobyłem się na
poprawienie systemu overlayów w silniku. Gwoli wyjaśnienia – overlay (jak to przetłumaczyć na polski, “nakładka”?) to dwuwymiarowy element sceny, który jest tak jakby nakładany na ekran – świetnym przykładem będzie tu HUD (informacje o zdrowiu, pancerzu, amunicji), portret postaci czy też inny HUD z pewnej nieznanej gry. Tak były też robione efekty czarów i obrażeń w Wielkim Mistrzu. Overlay można ustawić z pewną przezroczystością, dzięki czemu można zrobić coś w rodzaju znaku wodnego, co widać również w screenie przy nagłówku.
Od technicznej strony sprowadza się to zapamiętaniu wartości macierzy rzutowania i wprowadzeniu projekcji dwuwymiarowej (w OpenGL-u odpowiada za to funkcja gluOrtho2D, chyba że ktoś chce samemu sobie liczyć). Ponadto macierz model-widok staje się macierzą jednostkową i po tych operacjach można już rysować nasze świecidełka. Z ciekawostek powiem, że w podobny sposób (choć nie aż tak łatwo - można tutaj równie dobrze zahaczyć o postprocessing) można uzyskać efekt soczewek (lens flare), co zostało opisane w Perełkach Programowania Gier (tom 1.).
Cały problem u mnie polegał jednak na tym, że koniecznie chciałem, aby każdy overlay mógł również być powiązany z wyświetlaniem tekstu. Oczywiście, dałoby się to zrobić otwierając folder z frameworkiem i ściągając cały kod. Problem jednak w tym, że to działania zahaczające o bezpośredni tryb przekazywania danych (glVertex i te sprawy – proste, ale ble, więc nie chcę się narażać) oraz funkcje windowsowe (a my nie chcemy się ograniczać do produktu Microsoftu, choć przyznaję uczciwie, że na Linuxie wersji testowych nie sprawdzałem). Kwestią oczywistą jest to (kurczę, zbyt ładnie ostatnio piszę, muszę spuścić z tonu), że skoro korzystamy z SDL-a, to należy poszperać tu i ówdzie (i pomiędzy) za funkcjami tej biblioteki, które pomagają w ukazaniu liryki słownej na monitorze. Okazało się, że istnieje taka pomocnicza biblioteka jak SDL_ttf, która pozwala na proste wczytywanie czcionek TrueType Font i wyświetlanie tekstu z ich udziałem. Fakt, że są to dodatkowe wpisy w linkerze, ale mówi się trudno. Pierwsze podejście odbywało się zgodnie z tym tutorialem. Po przejrzeniu, podekscytowaniu się (spodobało mi się to słowo po odpowiedzi gry Neverwinter Nights, gdy po walce chciałem podjąć rozmowę - “Jesteś zbyt podekscytowany, aby teraz rozmawiać”) i wpisaniu odpowiedniego kodu okazało się, że jednak nie działa – wszystkie inicjalizacje zostały przeprowadzone prawidłowo, a jednak tekst się nie wyświetla. Nie pomógł debugger ani usilne wpatrywanie się w kod – SDL_BlitSurface wyraźnie miał wobec mnie niecny zamiar zdenerwowania mnie. Podejrzewając, iż wina leży po stronie tego, że SDL wykorzystuję tylko jako fundament, a całość hula na samym OpenGL-u, począłem poszukiwanie informacji o innych sposobach już samego wyświetlenia tekstu (a nie tylko przygotowania czcionki i powierzchni tekstu). Wtedy pomocną dłoń wyciągnęło wiki.gamedev.net, które przedstawiło mi taki oto tekst. Muszę przyznać, że podczas poprzednich wędrówek po zasobach Internetu spotkałem się już z podejściem tworzenia tekstury z powierzchni SDL_Surface i korzystaniu z niej przy renderowaniu, ale nie potraktowałem tego nigdy poważnie – choćby ze względu na wydajność, która wydawała mi się wątpliwa. Cóż, nadal tak mi się wydaje, ale w końcu sposób przedstawiony na tej wikistronie zadziałał i to nawet z użyciem tablic wierzchołków. Dzięki temu w grze można wrzucić pasek HUD z żądaną przez nas teksturą i obok pisać “Zdrowie: 114, Pancerz: 100, Satysfakcja: bezcenne”.
Overlaye można ustawiać już w kodzie, ale można też wczytać definicję z pliku, podobnie jak meshe. Jest też możliwość ustawienia jedną zmienną overlaya pełnoekranowego, co pozwoli zrealizować na przykład efekt krwi. Idąc dalej można spróbować robić prymitywne GUI. Bardzo prymitywne. Bardziej prymitywnego nie widzieliście. Przynajmniej wątpię.
Wspomniałem na początku o tygodniowych wakacjach – nawet nie wiecie jak to czasami dobrze wypocząć bez komputera. Choć było ciężko. Tym niemniej nie oznacza to jednak, że nie myślałem o silniku czy w ogóle o projektowaniu. Przeciwnie, na podręcznych brulionach powstało wiele koncepcji oznaczonych jako “co dalej”.
- System cząsteczkowy na wzór tego, podobnego lub innego (i tralalatego, aby do rymu było)
- Bump mapping (pierwsze podejście zostało już spacyfikowane przez nieprzyjazne wobec mnie siły matematyki, zbieram siły na kolejne)
- Klasa singletona (przyda się dwóch poniższych klas)
- Klasa managera logów, który automatycznie zapisywałby pewne rzeczy w pliku (inicjalizacje itp.). Byłby to singleton dostępny z każdego miejsca w programie
- Klasa profilera, który też byłby singletonem i służył do testowania wydajności. Bardziej zabawka, aby ładnie wyglądało
- Cienie (do których zabieram się od jakiegoś czasu, ale z bardzo miernym skutkiem)
- Cały system tzw. meshy naturalnych (teren, niebo, drzewa, trawy, wody, trolle), na razie w zamyśle wybitnie koncepcyjnych (czyli jak napisać klasy)
- Parę pomniejszych przeróbek
Ile z tego uda się wykonać przed rozpoczęciem kolejnego roku akademickiego – trudno rzec, bardziej to zależy od chęci do testowania. I od tego, ile jeszcze filmików na YouTube mnie zaciekawi.
Pozdrawiam i dziękuję - SceNtriC
0 komentarze:
Prześlij komentarz