Maniacs Patch nie gryzie #12 – Minimapa

W dzisiejszej odsłonie kursu zajmiemy się prostym, ale efektywnym skryptem na stworzenie od zera minimapy w naszym projekcie. Generalnie istnieją trzy sposoby tworzenia minimapy:

  • narysowanie jej samemu od zera
  • pomniejszenie i ewentualnie przerobienie gotowej mapy
  • wygenerowanie minimapy.

Dzisiaj zaprezentuję ostatni z tych sposobów, ponieważ jest najszybszy i uwzględnia wszystkie zmiany, które na bieżąco będziemy nanosili na naszą mapę.

Przygotowania

Do dzisiejszego skryptu nie będziemy potrzebowali TCP, w zupełności wystarczy nam standardowy zestaw narzędzi oferowanych przez Maniacs Patcha. W założeniach minimapa będzie składała się z obrazków o rozmiarze 3×3 piksele, które będą symbolizowały tile z wykorzystanego przez nas zestawu grafik. Każdy tile będzie posiadał inny kolor. Poniżej przygotowana przeze mnie grafika, która zawiera 12 różnych kolorów, a jako trzynasty umieściliśmy prostokącik symbolizujący zdarzenia na mapie (np. jaskinie albo miasta). Pod grafiką oryginalną powiększenie 10x

Dodatkowo proponuję odrębny kafelek dla zaznaczania bohatera. Będzie on animowany przy pomocy spritesheetów, dlatego wystarczy nam coś takiego:

Przygotowanie mapy

Kolory na powyższej grafice ułożone są w określonej kolejności. Pierwsze co powinniśmy zrobić to przejść do zakładki Terrain w bazie danych i przygotować tyle typów terenu, ile różnych kolorów chcemy wykorzystać do generowania minimapy. Kolejność musi zgadzać się z kolejnością kolorów na grafice:

Następnie w zakładce Tilesets przechodzimy do tilesetu, na którym chcemy pracować i przyporządkowujemy typy terenów grafikom, które wykorzystamy do budowania mapy:

Ostatnim krokiem będzie przygotowanie mapy. Nasz skrypt każdy event będzie pokazywał jako miejsce, gdzie gracz może dotrzeć, dlatego warto o tym pamiętać przy projektowaniu:

Początek skryptu

Powyższa mapa ma rozmiar 80 x 60 pól. Jeśli chcemy, by każdy tile był reprezentowany przez jeden obrazek, wyjdzie nam ich 4800! To zdecydowanie więcej, niż limit dopuszczony przez RPG Makera 2003. Tutaj z pomocą przychodzi nam Maniacs Patch. Na ostatniej stronie komend zdarzeń znajduje się opcja Set Game Option, która umożliwia nam m.in. zwiększenie limitu obrazków. Dla bezpieczeństwa ustawmy go na 5000.

Powyższą komendę wystarczy wybrać raz, ale żeby nie robić zamieszania umieścimy ją od razu w common evencie rysującym mapę, którego triggeru ustawiamy na None. Następnie tworzymy zmienne odpowiadające za X i Y mapy, X i Y obrazka oraz jego numer. Dwie pierwsze ustawiamy na zero (bo będziemy zaczynać rysowanie od lewego górnego rogu mapy), X obrazka powinno wynosić 41, Y 31, a jego numer – 1. Jeśli przyjmiemy takie wartości początkowe, minimapa wyświetli się nam dokładnie na środku ekranu. Oczywiście jeśli jej wielkość będzie inna, albo będziecie chcieli umieścić ją w innym miejscu, początkowe X i Y obrazka będą inne. Na ten moment wszystko powinno wyglądać tak:

Teraz przechodzimy do najtrudniejszej (ale nie aż tak trudnej) części skryptu).

Rysujemy minimapę

Na ten moment (bez pozycji gracza), całość skryptu wygląda tak:

Całość odbywa się w pętli, którą przerwiemy dopiero wtedy, gdy przerobimy wszystkie tile na mapie, od górnego lewego rogu do dolnego prawego. W pętli w pierwszej kolejności zapisujemy do zmiennej Event ID wartość sprawdzając aktualny kafelek na mapie. Jeśli znajduje się na nim zdarzenie, wartość będzie wynosiła więcej niż 0. W taki przypadku pokazujemy ostatni element z przygotowanego wcześniej przez nas spritesheeta symbolizujący zdarzenie.

Jeśli na danym kafelku nie ma zdarzenia, w polu Else zapisujemy do nowej zmiennej wartość ID danego terenu (po to wcześniej były nam potrzebne te zabawy w Bazie danych), a następnie pokazujemy obrazek ze spritesheeta o numerze takim samym, jak ID terenu.

W dalszej kolejności zwiększamy wartość Map Tile X o 1, ponieważ będziemy sprawdzali kolejny kafelek na mapie po prawej. Pamiętajcie, że nasza mapa ma 80 pól szerokości numerowanych od 0 do 79. Dlatego musimy sprawdzić, czy przypadkiem skrypt nie dotarł już do prawej krawędzi mapy. Jeśli wartość Map Tile X jest równa 80, tak się właśnie stało. Musimy zatem ponownie wrócić na lewą stronę (Map Tile X ustawiamy na 0), przywrócić pierwotną wartość X dla obrazka, zwiększyć Map Tile Y o 1 (bo będziemy sprawdzać kafelki położone o jedno pole niżej) oraz zwiększyć Y obrazka o 3 (żeby nowy rząd wyświetlał się pod poprzednim). Jeśli natomiast nie dojechaliśmy do prawej krawędzi, wystarczy jedynie, że w polu Else zwiększymy X obrazka o 3, tak żeby kolejny pojawił się po prawej stronie poprzedniego.

Ostatnie co nam zostało to sprawdzenie, czy dotarliśmy na sam dół mapy. Jeśli Map Tile Y wynosi 60, przerywamy pętlę. Jeśli nie, zwiększamy ID obrazka o 1, żeby nowe obrazki nie zakrywały starych.

Wywołanie minimapy

W drugim common evencie ustawionym na Parallel Process wyłączamy menu i przechwytujemy klawisz ESC (lub inny dowolny). Jeśli przełącznik Minimap jest ustawiony na OFF (a na początku gry zawsze jest), wywołujemy event z minimapą i włączamy przełącznik. Jeśli nie jest, usuwamy obrazki i wyłączamy przełącznik. Dzięki temu możemy odpalać minimapę!

Dodajemy pozycję gracza

No dobra, brakuje nam jeszcze pozycja gracza na mapie. W tym celu przed zwiększeniem Map Tile X o 1 dodajemy następujący kod:

Do nowych zmiennych zapisujemy pozycję X i Y gracza. Jeśli jest taka sama jak aktualnie sprawdzany kafelek mapy, zwiększamy ID obrazka o 1 (żeby nie nadpisać poprzedniego) i pokazujemy pozycję gracza przy pomocy drugiego z przygotowanych przez nas plików.

Teraz możemy bez przeszkód wyświetlać i zamykać naszą minimapę!

Wyświetlanie w czasie rzeczywistym

Jeśli pierwszy event ustawimy na Parallel Process, jako przełącznik wskazując ten sam co przy wywołaniu mapy, minimapa będzie aktualizowała nam się w czasie rzeczywistym, gdy będzie poruszać się po mapie.

Oczywiście nieustanne rysowanie prawie 5 tysięcy obrazków może być obciążające dla komputera (choć ja nie zauważyłem spadku płynności gry), dlatego należy stosować tę metodę bardzo ostrożnie. Na bazie powyższych zasad możecie dostosować minimapę do gry – zmienić jej rozmiar, miejsce i przezroczystość, by nie przeszkadzała w poruszaniu się po mapie świata.

Michał „Michu” Wysocki

– Download przykładowego projektu –

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.