W ostatnim odcinku skończyliśmy główną część modemu, który będziemy wykorzystywać do przesyłania informacji pomiędzy grami. Czas teraz napisać grę. Zapraszam.
Pomysł
W innym poście wspomniałem, że dobrze byłoby zrobić jakąś sympatyczną gierkę o piratach, z perspektywą migracji na urządzenia mobilne. Usiadłem na chwilę z kartką papieru i zapisałem parę pierwszych ogólników. Będzie to dwuwymiarowa gra z widokiem z góry, polegać będzie na dwuturowym systemie:
Tura ruchu
Najpierw wybierany jest wektor do poruszania się (gracz klika w jakieś miejsce ekranu, tam będzie zmierzał statek), do tego paskami reguluje prędkość statku, przyciskami czy statek ma strzelać, jeśli tak, to znowu odpowiednimi przyciskami wybierana jest lewa lub prawa burta, a także suwakiem – po jakim czasie ma strzelać.
Następnie klikane jest – koniec tury -, odpowiednie informacje przesyłane są naszym modemem do drugiego gracza, drugi gracz robi to samo, dane przesyłane są do pierwszego, następuje tura symulacji.
W turze symulacji przez 4-5 sekund statki robią właśnie to, co de facto zaprogramowało im się w turach ruchu.
Cała gra po przeniesieniu na telefon i pozbyciu się modemu dźwiękowego mogłaby być na prawdę dobra, powiedzmy, że mielibyśmy max. 10 sekund ograniczenia na swoje ruchy i wszyscy gracze (najlepiej kilkunastu na dużej mapie!) robiliby swoje tury asynchronicznie.
Po skończeniu gry działającej z modemem właśnie za tę wersję się zabiorę.
Swoją drogą, znalazłem dobry artykuł na temat różnego podejścia do projektowania gier.
Technologie i narzędzia
Aby całość współgrała z modemem napisanym w Javie, będę korzystał z frameworka LibGDX (możesz go kojarzyć np. z Turn The Snake albo Speechlist).
Realizacją fizyki zajmie się Box2D, a jeśli chodzi o narzędzia to poza edytorem map Tiled, nic innego na razie nie potrzebuję.
Na ten moment większość zasobów z których będę korzystał będzie z tej paczki. Grafiki wyglądają świetnie, a licencja pozwala również na użycie komercyjne.
License: (CC0 1.0 Universal) You’re free to use these game assets in any project, personal or commercial. There’s no need to ask permission before using these. Giving attribution is not required, but is greatly appreciated!
Zaczynamy
Grę w LibGDX zaczynam od pobrania i uruchomienia prostego generatora projektów:
Z ich strony wynika, że mają wsparcie do Xboxowego pada, stąd zaznaczyłem, by ściągnęły się moduły do jego obsługi – być może później się przydadzą.
Po imporcie świeżo wygenerowanego projektu, początkowy szablon nie wygląda zbyt imponująco:
Za podstawę do naszej gry wezmę Mad Pirates – grę, którą zacząłem pisać jakiś rok temu ale szybko porzuciłem. Przerzuciłem całość kodu, do tego zmieniłem tekstury na te z podanej wyżej paczki – są o wiele ładniejsze, a co do licencji starych nie byłem pewien.
W Tiled dodałem kilka obiektów (wyspy), które później można zaimportować w kodzie do silnika symulacji fizycznych:
Prezentuje się to tak:
Ruchy statków jak na lodowisku są celowo karykaturalne, docelowo nie będą aż tak porywiste, ale pasują do lekkiej, rysunkowej stylistyki.
Co dalej?
Na filmiku widać co jakiś czas białe paski wzdłóż kafelków, na ten moment nie wiem czego wynikiem są takie artefakty, ale na pewno jest to zbyt widoczne, żeby tak zostawić.
Do tego oczywista oczywistość – naprawa ruchu okrętu. Na ten moment, dla przykładu – kiedy statek jest skierowany w dół, lekko w prawo, kiedy kliknie się poniżej statku po lewej, statek wykona praktycznie pełny obrót o ~360 stopni, zamiast obrócić się o te kilka stopni w bardziej optymalną stronę.
Przydałoby się też lepsze zorganizowanie kodu, przemyślane pod komunikację za pomocą dźwięku.
W następnej części dzielimy ruch na tury opisane we wstępie i dorzucamy krzywą ruchu rysowaną tuż po kliknięciu, od statku do punktu.
Odnośniki
Aby odróżnić sam modem od gry wraz z modemem, utworzyłem nowy branch na GitHubie:
https://github.com/dbeef/soundcoding/tree/game