Trzecia część przeglądu kodu moich gier/aplikacji. Zapraszam.
Gra której większość napisałem w zasadzie w ciągu weekendu. Niepotrzebne były jakiekolwiek assety z Open game art czy temu podobnych stron stron (poza dźwiękami kliknięcia i czcionką). Wariacja na temat Snejka i kręcących w głowie kolorowych gierek.
Pisałem to dość dawno, stąd od razu ostrzegam przed powtarzaniem złych praktyk pisania kodu, jaki jest w tym repozytorium.
Przed dalszym czytaniem polecam ściągnąć tutaj, lub obejrzeć poniższy filmik.
Gameplay
Film mocno klatkuje, prawdopodobnie ze względu na niezmierzone pokłady mocy mobilnego celerona.
Technologie:
- Java
- LibGDX
Przez jakiś czas wspierałem również reklamy poprzez AdMob (wykupione przez Google w 2009) i darmowe Google support library do współpracy z Androidem. Działało O.K (chociaż zwiększały wagę całej gry z 1 MB do >5MB), ale nie było powodu by z niego korzystać – na dłuższą metę reklamy przeszkadzały w grze a pieniądze z reklam…
Monetyzacja
Po ponad roku od wrzucenia TTS i półtora roku po wrzuceniu Memo Boxes, moje konto AdMob wygląda następująco:
Nie, żebym liczył na więcej, ale takie są realia. Nie ma co liczyć na randomowe pobierania osób kręcących się po Google Play, jeśli nie porozsyłasz gry ani nie dotrzesz w żaden inny sposób do odbiorcy to licznik pobrań stanie na 50. Wydaje mi się, że nawet zatrudniając grafików i tworząc zawartość postawioną na jakość, jest to bariera nie do przeskoczenia. Co stawia nas przed kolejnym problemem.
Marketing
Napisałem kiedyś osobny post o tym jak zerowym kosztem podnieść sobie licznik pobrań, tymczasowo wskoczyć na top kilkaset według pobrań danego dnia i mieć trochę szansy na wybicie się. Żeby nie powtarzać się, krótko podsumuję to, co sam próbowałem:
Udostępnianie linków do pobrania na gamedevowych grupkach na Facebooku, m.in:
- https://www.facebook.com/groups/481879901888841/
- https://www.facebook.com/groups/digitalwolfcommunity/
- https://www.facebook.com/groups/723454034394008/
- https://www.facebook.com/groups/227592780726252/
- https://www.facebook.com/groups/207387192640485/
- https://www.facebook.com/groups/mobilegamedevs/
Po wrzuceniu na grupki odnotowałem +200 pobrań w ciągu kilku następnych dni.
Są serwisy, które same szukają zawartości do wrzucenia i mają formularze kontaktowe, gdzie można podesłać swoją grę. Wysłałem Memo Boxes i po 3 miesiącacach dostałem w zwrocie odpowiedź:
Plus LibGDX jest taki, że piszesz raz i uruchamiasz w przeglądarce, Androidzie, na desktopie i przy odrobinie szczęścia na iOS. Udało mi się wyeksportować wersję .war Memo Boxes i im podesłać, przy czym coś musiałem zepsuć przy eksportowaniu ewentualnie wynikało to z niedoskonałości przenoszenia libGDX na stronę, ale MemoBoxes działało okropnie. Za to dostałem darmową reklamę i coś w rodzaju recenzji.
Do tego próbowałem podesłać TTS do Ketchappu (wydawali kiedyś właśnie takie proste, kolorowe gierki), zero odzewu po automatycznym zwrocie:
Do tego gdzieś w internecie znalazłem kiedyś listę maili (w tabeli Excela) do dziesiątek serwisów o telefonach które piszą o aplikacjach/grach (głównie anglojęzyczne), myślę że taka aktualna lista nadal jest gdzieś do pobrania po odpowiednim wyszukaniu.
Sekrety działania
Sposób poruszania węża
Gdyby wyłączyć obrót figury, wąż poruszałby się po funkcji liniowej równolegle do jednej ze ścian danej figury, po kliknięciu zmieniałby ścianę do której równolegle się porusza na następną. W zasadzie to robiłem to bardzo na wyczucie, renderując obrazek pięciokąta i zmieniając współczynnik funkcji tak, aby wąż nie zbliżał się, ani nie oddalał od śledzonego boku. W kodzie wyglądało to tak:
if(timerMove > 0.0000005f){ snakeX = (float) snakeX + waysX[way]*(float)(ogniwa -1f) ; snakeY = (float) snakeY + waysY[way]*(float)(ogniwa -1f) ;
Gdzie waysX i waysY wyglądały następująco:
waysX[0] = 1; waysX[1] = -1.5f; waysX[2] = 1; waysX[3] = -0.32f; waysX[4] = 1; waysY[0] = -1.74f; waysY[1] = 0; waysY[2] = 1.74f; waysY[3] = 1; waysY[4] = 0.725;
Jak zrealizowałem jednoczesny obrót figury i zmianę funkcji po której poruszał się wąż?
Przy każdym kliknięciu iterowałem po elementach tablicy zawierającej współczynniki kierunkowe, przechodząc do następnego, odpowiadającego kolejnemu boku.
Co do obrotu całości:
Wygląda to bardzo archaicznie i nie polecam pisać w ten sposób, ale działa tak:
w momencie kliknięcia ekranu, ustawiam buforCam na wartość 120, timerem steruję odpowiednią szybkość odejmowania, za każdym odliczeniem odejmując 8 od bufora i jednocześnie obracając całość o 8 stopni. To (w przypadku pięcioboku) da całkowity obrót o jeden bok. Bardzo nieczytelne i przekombinowane.
Kolory
Zdefiniowałem kilka barw skali 0/255 w które mogłem wcześniej sprawdzić np. tutaj. Następnie z każdym kliknięciem przesuwam się o jeden element po tablicy, stopniowo zmieniając aktualną barwę tła.
Realizacja kolizji:
Nie korzystałem z chociażby Box2D (po co wyważać drzwi buldożerem). Zamiast tego, zdefiniowałem obiekty Rectangle dostępne w LibGDX i korzystając z gotowych funkcji liniowych przypisałem ich kilkaset wzdłuż boków. Do tego tworzę obiekt typu Rectangle na każdej z części węża, można więc przy każdej klatce zwyczajnie iterować po tablicach z Rectanglami i sprawdzać czy części wężą nie kolidują ze sobą albo z bokami.
Poniżej mocno nieczytelny przykład:
Odnośniki:
Link do pobrania gry:
Udostępniam całość kodu za darmo tutaj, jakość pozostawia sporo do życzenia, nie polecam do nauki.
Soundcloud kolegi który podsunął pomysł na TTS: