środa, 22 marca 2017

Edytor Map

W dzisiejszym wpisie postaramy się dodać edytor map do projektu. Poprzednio podczas planowania jednym z założeń jakie wynotowaliśmy było aby gra posiadała wiele poziomów, map, w celu uczynienia rozrywki bardziej różnorodnej i atrakcyjniejszej. Mapy są niczym innym jak elementami porozmieszczanymi po całym świecie, którego zaś fragment widzimy w naszym widoku. Teraz zastanówmy się jakby możliwe byłoby dodawanie wszystkich tych  wymienionych elementów takich jak: platformy, teleporty, przeszkody poprzednio tak „twórczo” wymyślone.

Podejście A

Pierwszym z pomysłów które może przyjść to aby przedmioty umieszczać po wysokości i szerokości wielkości naszego ekranu świata gry, gdzieś tam zaznaczając to w kodzie. Ale pytanie czy byłoby to wygodne? Akurat to pytanie nie jest z kategorii do zastanowienia, wydaje się dla nas oczywiste, żyjemy w święcie gier od młodych lat. Opiszmy to pierwsze podejście. Każdy z elementów mógłby być zahardkodowany, czyli wpisany na sztywno bezpośrednio w kodzie wysokość i szerokość. Można tworzyć zmienne typu Integer czyli przechowujące wartość liczbową i te zmienne później używać w metodach, które odpowiedzialne są za rysowanie tych obiektów. Do rysowania bloków stosowane byłyby różne pętle które jak wiemy wykonują się w ściśle określonych regułach, warunkach np. liczba powtórzeń, czy konkretne zakresy współrzędnych. To podejście jak najbardziej zadziała, ale jest zbyt uciążliwe i czasochłonne w realizacji, co chcemy oczywiście uniknąć.

Podejście B

Wyobraźmy sobie mamy ekran naszej planszy i myszką zaznaczamy miejsca w których chcemy umieścić dany obiekt, bądź obiekty. Dodatkowo od razu widzimy jak będzie to wyglądać w praktyce. Podobne obiekty np. platformy jednego typu możemy wrzucać w kontenery, czyli coś co przechowuje wiele wartości. I następnie wyświetlać całość kontenera jako jedną warstwę do której możemy podpiąć logikę, np. chcemy aby po najściu na tą warstwę postać straciła punkt życia w wyniku wejścia w płomienie.

Kontenery to taka struktura danych która umożliwia przechowywanie obiektów w sposób zorganizowany. Umożliwia ponadto operacje na tych zbiorach, takie jak przeszukiwanie, usuwanie i inne.

Rozwiązanie takie możliwe jest właśnie dzięki edytorom map. Są to narzędzia które znacząco przyspieszają cały proces tworzenia map. Całość zapisana jest do formatu wyjściowego który przy użyciu odpowiednich bibliotek można wczytać do aplikacji w przeróżnych aplikacjach i różnych językach programowania. Jeden z takich popularnych edytorów nosi nazwę Tiled i użyjemy go w projekcie. Jest on edytorem do grafiki w dwóch wymiarach, czyli posiadających wysokość i szerokość.



Rzuty

Elementy na mapie mogą występować w postaci prostokątów, elips, krzywych,  czy obrazków. Tiled wspomaga tworzenie zarówno ortogonalnych, izometrycznych i hexagonalnych map.

Przy okazji wyjaśnijmy co mówią te rzuty po kolei. O ortogonalności mówi się w miejscach gdzie występuje prostopadłość, może wystąpić zarówno w rzucie 2d jak i 3d. Projekcje ortogonalną cechuje także że wielkość obiektu nie jest zależna od odległości od kamery. Można to rozwiązanie spotkać w takich grach jak Tibia, bądź Simcity. 


Rzut izometryczny odzwierciedla przestrzeń 3d na płaszczyźnie, rzuty mają zawsze równą miarę kątów 120° między parami osi. Jest również przykładem rzutu równoległego. Świetnie prezentuje to rysunek poniżej



Hexygonalna mapa stworzona z sześciokątów, najczęściej można zobaczyć ją w grach wojennych, przykładem jest znana gra Heroes. Jeżeli nic wam nie mówią wymienione tytuły warto spojrzeć w google, są to klasyki gier.


Pobieramy Tiled

Pobieramy przechodząc na stronę w linku klikamy kolejno Download via itch.io, po przejściu do kolejnej strony klikamy Download Now. W Widocznym oknie mamy możliwość dotować developerów twórców tego narzędzia. Same zaś narzędzie jest co można przeczytać darmowe. Chcąc tylko pobrać bez dotowania klikamy na napis widoczny na obrazku poniżej.



Dalej możemy wybrać wersję pasującą do naszego systemu operacyjnego (windows, linux, mac) klikając przycisk Download przy odpowiedniej wersji. Powinien pojawić się okno pobierania instalatora.
Proces instalacji wygląda jak standardowy każdej aplikacji, nie ma przy tym żadnej konfiguracji. Lokalizacja miejsca instalacji nie ma właściwie znaczenia. Na końcu klikamy Finish i powinno automatycznie otworzyć się okno programu.

Nowa Mapa

W celu stworzenia nowego pliku mapy klikamy w lewym rogu na przycisku menu Plik, z listy wybieramy Nowy… Pojawia się okno tego rodzaju



Po kolei poustawiajmy i przeanalizujmy jakie możliwości mamy.

Na początku wybieramy orientacje ortogonalną, taka właśnie jest używana w platformówkach. Format warstwy kafelków ustawmy na Base64 (kompresowany zlib).

W format warstwy kafelków do wyboru mamy dwa formaty CSV i Bas64. CSV jest formatem gdzie dane przechowywane są w plikach tekstowych, a wartości rozdziela się przecinkami. Base64 jest formatem gdzie bajty koduje się ciągami znaków. Wybiera się 64 znaki którym przypisuje się wartości 0-63, 63 ponieważ 0 również uznaje się za wartość którą bierze się pod uwagę. Znaki zamieniane są na ciągi binarne, i następnie taki utworzony ciąg dzieli się na liczne podciągi. Jest powszechnie stosowany do kodowania poczty email, a jego charakterystyczną cechą jest że, zbiór wyjściowy jest o 33% większy od zbioru wejściowego.

Pojawia się tu słowo kodowanie i bajty, można jeszcze podciągnąć co to znaczy bit.
Kodowanie to przede wszystkim taka transformacja tekstu jawnego aby stał się nie dostępny niepowołanym osobom trzecim. Stosuje się tu zamiennie pojęcia kod i szyfr. Jednak istnieją subtelne różnice które je rozróżniają, a dotyczą głównie stopnia przekształcenia.

Kolejność renderowania kafelków domyślnie ustawiona jest na Prawy Dół i tak możemy zostawić. W rozmiarze mapy ustawiamy szerokość i wysokość w ilościach kafelek mieszczących się na mapie. Początkowo ustawimy 20 kafelek wysokości i 40 szerokości, co w późniejszych etapach może ulec zmianie. Rozmiar kafelka ustawiamy również na 70x70 px, co głównej mierze zależy jakie wielkości tekstury posiadamy bądź stworzymy w przyszłości. Samo 70px mówi ile pikseli mieści się w jednym „kartoniku”. Im jest ich więcej tym tekstury są ładniejsze i bardziej szczegółowe. Obecnie większość gier stosuje większą nowocześniejszą rozdzielczość, mówi się wtedy że są bardziej „mangowe”, a 16 px określa się jako „retro”. Po wybraniu obu wielkości możemy zobaczyć jaką rozdzielczość w pikselach będzie miała cała mapa (2800x1400 pikseli).

Pierwsze co należy zrobić to załadować pliki graficzne z teksturami które będziemy używać do tworzenia map. Można do tego używać pojedyncze grafiki albo całe zestawy zwane tilesety. W Internecie można znaleźć sporo stron na których można je znaleźć. Zawsze jednak należy patrzeć jaką licencje posiada dany plik. Jednym dość popularnym źródłem jest opengameart.org, gdzie większość jest na licencji creative commons, co znaczy tyle że autor przekazał je domeny publicznej i można robić z nimi wszystko bez ograniczeń, bez żadnej wymaganej zgody. Te które wpadły mi akurat w oko to link. Należy rozpakować i w folderze Tiled zestaw nosi nazwę tiles_spritesheet.png.

Dodanie tekstury do Tiled

W aplikacji Tiled klikamy na znaczek dodaj w dolnym prawym rogu


W oknie w miejscu gdzie wybieramy źródło klikamy przeglądaj i wskazujemy rozpakowany wcześniej tiles_spritesheet.png. Szerokość i wysokość kafelka ustawiamy na 70 px, identyczne jakie zawiera plik tile który posiadamy. Margines mówi o odległości od wszystkich zewnętrznych krawędzi obrazka, u nas nie ma więc ustawiamy na 0 px. Konieczne jest natomiast ustawienie Rozstawu na 2 px, takie zawiera nasz przykładowy zbiór. Można kliknąć OK.


„Wyklikujemy” mapę

W prawy rogu mamy okno z warstwami. Warstwy można traktować jako elementy tego samego typu. Przykładem może być podłoże tego samego typu, bądź monety do zebrania. Każdej warstwie można będzie w naszej grze przypisać inną logikę, jaka ma być wykonywana podczas interakcji naszej postaci z daną warstwą, bądź warstw między sobą. Na początku stworzymy tło, podłoże i kilka platform tego samego typu aby później można było naszą postacią po tym chodzić i skakać. Klikamy dwukrotnie na Warstwa Kafelków 1 i zmieniamy nazwę na background.


Teraz z zestawu kafelków wybieramy taki jaki chcemy użyć do tła, pełny niebieski kwadracik z zestawu wygląda na odpowiedni na tymczasowe tło. Z menu klikamy na ikonę wypełniania i klikamy na obszarze całej mapy. Powinno wypełnić nią całość obszaru.


Teraz pora na podłoże. W tym celu klikamy na ikonę białej kartki z żółtym słoneczkiem w górnym okienku z warstwami, tak jak na rysunku powyżej. Po kliknięciu rozwinie się lista z której wybieramy Object Layer i nadajemy nazwę ground. Teraz zaznaczając warstwę i wybierając kafelkę jaką wybraliśmy dla niej i możemy umieszczać je na mapie klikając. Tu zostawiam wam dowolność. Ten który stworzyłem znajdzie się później na githubie przy kolejnej aktualizacji projektu.

Aha to co można zauważyć to że podłoża są typem obiektowym, chyba domyślacie się dlaczego. Potrzebna będzie jeszcze logika do tego Na dziś wystarczy tyle, pokazany był proces tworzenia mapy, następnie trzeba będzie go podpiąć do projektu, to już wkrótce. Nie zapomnijcie zapisać tego co zrobiliście do tego momentu.

Do zobaczenia.

Brak komentarzy:

Prześlij komentarz