Wariacja o space invaders w JavaScripcie cz. 3 (Ostatnia, wersja niekompletna)

Aż cztery posty o jednym prostym projekcie 🙂 Ale ten post jest (na szczęście?) już ostatni, obiecuję.

W moim początkowym zamyśle, gra ta miała działać w następujący sposób: gracz widzi tylko ten input, który aktualnie musi wpisać, potwierdza przyciskiem, gra reaguje a gracz widzi kolejny.

Długo dłubałem przy tym projekcie (dwie poprzednie wersje to potwierdzają), co rusz dodając coś nowego. Ostatnim dodanym tworem jest prosty system kontrolowania stanów. O tym będzie dzisiejszy post.

space invaders w Javascripcie

Aktualną wersję gry zobaczyć możecie tutaj.

Tak jak piszę w tytule, nie jest to kompletna wersja. Wciąż jest parę rzeczy, nad którymi można byłoby jeszcze popracować. Prawda jest taka, że zmęczył mnie ten projekt i za każdym razem gdy do niego siadałem, kompletnie traciłem wenę. Ponieważ ma to być zabawa postanowiłem, że kończę i pozostawię go w takiej formie jakiej jest, dając sobie zarazem możliwość aby iść dalej z kolejnymi projektami. Obiecałem sobie, że wszystkie zakończone rzeczy publikuję na blogu, więc i to tu trafia 🙂

Nie będę tym razem opisywał całego kodu linijka po linijce, głównie dlatego, że jest trochę zaśmiecony i nie wszystko działa 😛 Mimo to, bardzo zachęcam do zajrzenia w źródło strony i przeanalizowania go na własną rękę 🙂 wszelkie uwagi i przytyki możecie zostawić w komentarzu 🙂 Opiszę za to główną idee, na bazie której gra miała działać i wyjaśnię dlaczego nie do końca wypaliło.

Gra jest grywalna, można pograć 🙂 ma jednak parę dziur. Te o których wiem, spowodowane są nieodpowiednim operowaniem, źle wprowadzonymi danymi. Przykładowo, jeśli gracz wprowadzi nieprawidłowe dane (np. zbyt duże / małe wartości lub tekst zamiast liczb), gra i tak się toczy, pocisk jest marnowany.

Niektóre można by było pewnie łatwo załatać. Na przykład to, że gracz, może klikać przyciski „porusz statek” oraz „ognia” nie wprowadzając danych, co pomniejszy ilość pocisków, ale nie sprawdzi czy gra została przez to zakończona (można tak zejść do ujemnej wartości pocisków, co kończy się tym, że gracz ma nieskończoną ilość prób/’żyć’). Jednak tak jak pisałem, rzeźbiłem ten projekt bardzo długo i mam już go trochę dość. Przynajmniej trzy razy kasowałem zawartość pliku *.js do zera i zaczynałem od nowa 🙂 Ale koniec narzekań. Przejdźmy do mięcha.

Idea była taka aby wykorzystać mechanikę stanów. Wzorzec równie popularny w programowaniu gier co game loop. Jak to działa? Sprawa jest prosta, mamy zmienną, która reprezentuje stan oraz mamy funkcję, która robi różne rzeczy w zależności od tego jaki stan mamy i zmienia stan na kolejny. Zaimplementować można to na wiele sposobów. Mój miał być bardzo prosty. Opiszę to w pseudo kodzie:

Wydaje się być bardzo sprytne, jak na tak prostą grę, wręcz idealne. Niestety, kiedy zabrałem się za implementację okazało się być mniej kolorowo. W zamyśle, funkcja odpalGre miała na każdy stan pokazywać kontrolki i odpalać to co należy. Czyli jeśli stan to statek, funkcja miała pokazać kontrolki statek a po naciśnięciu przycisku miały dziać się cuda, czyli statek miał fruwać. Jeśli stan to rakieta, to po naciśnięciu przycisku miała odpalać się rakieta.

Niestety ta logika jest niepoprawna 🙂 W swej naiwności odkryłem to dopiero gdy zacząłem pisać program, i gdy nie wszystko działało jak należy…

Więc gdzie jest błąd? No cóż. Skoro jedno odpalenie funkcji odpalGre pokazuje nam kontrolki (input i przycisk) to jak ma od razy wykonać akcje, na podstawie danych z kontrolek które dopiero się pojawiły. odpalGre(stan”statek”) pokazywało kontrolki statku, ale ni mogło nim poruszyć, ponieważ gracz dopiero widzi input. Wypełnia go, klika „Ognia” co odpala odpalGre(stan”rakieta”). Dopiero teraz statek się porusza a gracz widzi kontrolki rakiety.
Czyli, stan statekrakieta porusza statkiem.
Jasne? Nie bardzo? No właśnie. Niby wszystko działa jak trzeba, ale kiedy sobie pomyślę jak to trochę boli mnie głowa. W sensie, nie jest to bardzo skomplikowane, ale trochę mało jasne. A gdy czyta się kod to już w ogóle Cieżko się połapać. Takie rzeczy nie przejdą 😀

Myślę, że musiałbym zmienić podstawową logikę w grze, abym był zadowolony. Z tym pomysłem próbowałem robić różne rzeczy i zawsze kończyło się to tak, że coś nie do końca działało. Może ktoś ma jakiś inny pomysł jak z tym powalczyć? Ja póki co odpuszczam. Inne projekty wzywają 🙂

Jaka płynie z tego nauka? Sam nie wiem. Może czasem warto odłożyć coś na półkę. Uczepiłem się trochę tego jednego pomysłu przez co nie mogę skupić się na nowych rzeczach i nie potrafię też „na świeżo” spojrzeć na ten projekt. Może po prostu czasem, trzeba przyznać się do porażki i cisnąć dalej 🙂

Pocieszam się tym, że niektóre światowej klasy tytuły też są wypuszczane z bugami. Może za rok wydam enhanced edition, gdzie obecne problemy będą rozwiązane.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *