Gry platformowe mają swoje szczególne elementy. Aby grę można było nazwać platformówką, musi posiadać kilka konkretnych cechy. Najważniejsza z nich to oczywiście platformy, po których gracz może się przeskakiwać. To już mam w swoim projekcie, co dalej?
Drugim najważniejszym, według mnie, elementem tego typu gier są drabiny. Oczywiście nie zawsze są to dosłownie drabiny, mogą to być liany w dżungli, czy wystające skały na klifie po których postać może przemieszczać się w pionie. Właśnie dlatego kolejnym elementem dodanym do mojej gry, będą drabinki.
W wersję platformówki z drabinkami zagrać można klikając w obrazek powyżej.
Na ekranie gry pojawiły się drabiny łączące widoczne platformy. Aby wspiąć się po drabince wystarczy do niej podejść i nacisnąć przycisk odpowiedzialny za skakanie. Będąc na drabinie można też nią zejść wciskając przycisk odpowiedzialny za kucanie.
Podczas wspinaczki postać oczywiście nie może skakać ani kucać. Może ona za to zejść z drabiny w dowolnym momencie używając przycisków kierujących w lewo lub prawo. Przesuwając się w poziomie dostatecznie długo spowoduje, że gracz spadnie. Poruszanie się w górę lub w dół, automatycznie wycentruje postać na drabinie (ciężko wspinać się jedną ręką i jedną nogą 🙂 ).
W ramach update’u powstał jeden nowy moduł – ladders.js. Trafił on do katalogu Actors. Moduł przechowuje wzorzec obiektu dla instancji drabin. Nie ma tu nic specjalnego. Warto tylko zwrócić uwagę na sposób w jaki drabiny są rysowane. Jest to obrazek jednego przęsła, rysowany wiele razy 🙂 .
Dodatkowo zmiany pojawiły się też w następujących modułach: loadingState, gameState, helpers oraz player.
Jeżeli chodzi o loadingState dodaje po prostu nowy obrazek do załadowania (przęsło drabiny), nie ma się nad czym rozpisywać.
W gameState oczywiście tworzę instancje drabiny i dodaje je do świata gry. Wygląda to tak samo jak w przypadku platform. Ważniejszą zmianą jest to, że podczas aktualizacji stanu, sprawdzam czy nie zachodzi kolizja pomiędzy graczem a którąś z drabin. Jeżeli tak, ustawiam w obiekcie gracza odpowiednie pola (wartość true dla flagi, odpowiadającej za to czy dotykana jest drabina, i referencja do dotykanej drabiny).
To samo robię z platformami. Gracz może przechodzić przez platformy gdy jest na drabinie, ale nie chce aby poruszał się na boki, gdy akurat z jakąś koliduje. Dlatego potrzebuje informacje czy kolizja zachodzi.
I tutaj pojawia się pierwsza uwaga. gameState to tylko przykładowy poziom. Takich stanów będzie więcej. Każdy z nich będzie sprawdzał czy gracz nie koliduje ze ścianą a pocisk z potworem itp. Dlatego te funkcje muszą zostać wywalone do osobnego modułu. takie ‚TUDU’ na przyszłość. Na razie zostaje jak jest, celem aktualizacji było dodanie drabin. Sprzątanie będzie później 😉 (ahh to legendarne ‚później’ 🙂 ).
Jeżeli chodzi o moduł Player, zmian było sporo, ale są one raczej oczywiste. Po prostu w obsłudze inputu gracza dodałem dodatkowe warunki. Na przykład jeżeli gracz jest na drabinie, przycisk ‚w’ będzie miał inny efekt niż jak gracz stoi na platformie.
Ostatni moduł ze zmianami to helpers, a dokładniej funkcja blockRect, Dodałem w niej dodatkowe warunki. Jeżeli pierwszy obiekt ma pole z flagą dotyczącą pobytu na drabinie i jest ona ustawiona na true, ruch przez drugi obiekt w pionie nie jest blokowany.
I to tyle jeżeli chodzi o dzisiejszy update. Gorąco zachęcam do zagrania/przetestowania tej wersji. Będę bardzo wdzięczny za każdą informacje zwrotną 🙂 .
Jeżeli masz jakieś pytania lub uwagi, śmiało skorzystaj z opcji dodania komentarza poniżej. Moja strona na facebooku też jest świetnym miejscem na kontakt ze mną. Warto też ją polubić aby być na bieżąco z nowościami na blogu.
Sciagnalem sobie kod, bede na pewno testowal, plus z braku doswiadczenia jestem zainteresowany jak wyglada Twoj kod.
Maly bug: jesli wskoczy sie na drabine, nie dziala wtedy spadanie :]
Dzięki za zwrócenie uwagi, przyjrzę się temu podczas najbliższego ‚ogarniania’ kodu 🙂 Mam nadzieję, że znajdziesz w nim coś ciekawego i pomocnego, choć trochę się boję, że w obecnym stanie może raczej dawać zły przykład 🙂