Jak i dlaczego powstała gra Saga Tanks


#1

Autor: Marcin “Noxy” Pędzimąż"

Impuls (Global Game Jam)

Styczeń 2013 roku, po wielu namowach w końcu ulegam i dołączam do ekipy “The Pirates” ( Na zdjęciu Ja to ten w okularach ) na Global Game Jam w Krakowie. Mam na imię Marcin i jestem jednym z twórców Saga Tanks. Nadchodzi dzień w życiu człowieka w którym stwierdza że warto poddać się testowi umiejętności, w moim wypadku to nie tyle test co chęć stworzenia czegoś w krótkim czasie, w końcu nie sztuka pisać gry miesiącami i zrobić coś co ledwo kaszle. Na co dzień zajmuje się pisaniem aplikacji biznesowych jako iOS Developer, ale od małego chciałem tworzyć gry i robiłem to ochoczo po pracy z gorszym albo lepszym skutkiem. Eksperymentuje już tak chyba 9 rok i jako rasowy “silnikowiec” który w nieskończoność ulepsza swój engine 3D nigdy nie ukończyłem oficjalnie żadnej gry jako indie dev. Przełomem w mojej stagnacji był jednak GGJ w którym okazało się że stworzenie pełnoprawnej gry wcale nie musi zająć lata i daje naprawdę ogromny fun. Przy okazji poznałem mnóstwo fajnych ludzi z którymi utrzymuję kontakt do dziś, ale najważniejszą lekcją wyniesioną z GGJ to chyba to ze nawet małe cieszy. Nie wspominam o tym wszystkim tylko dlatego że było fajnie ale dlatego że sposób pracy na jaki musiałem się przestawić podczas GGJ bardzo pomógł mi w pewnym krytycznym etapie produkcji Saga Tanks…

Ja tez coś zrobiłem (Tanks 12h)

Kamil Nowakowski, jeden z moich “guru” programowania, to jest ten typ człowiek przy którym zastanawiasz się czy aby na pewno nie jest on efektem eksperymentów w Roswell etc. Poznaliśmy się parę lat temu na GameDay prowadzonym przez mojego kolegę Maćka Byczyńskiego i od tego czasu często pomagał mi robić rzeczy niemożliwe. Kolejny z “silnikowców” który cale życie poświecił na pisanie swojego Silnika Barok Engine zaskoczenie nastąpiło jednak po moim powrocie z GGJ , kiedy to Kamil oświadczył że też zrobił grę. I to nie byle jaka, Czołgi 12h bo taka nazwę otrzymało jego dziecko, stało się baza naszego wspólnego projektu.

Początki

Był chyba koniec marca 2013 gdy wyprosiłem Kamila żeby udostępnił mi kod Czołgów 12h, on już z tym nic nie robił a ja miałem taki okres że co bym nie znalazł to portowałem na iOS a ta gra strasznie mi się spodobała i bardzo chciałem w nią zagrać jako ze jednak nie jestem urzytkownikiem Windowsa musiałem sobie jakoś poradzić. Po 3 dniach walki powstał pełnoprawny port na iPhona, przy okazji gra otrzymała nazwę kodowa Saga Tanks iOS i wtedy właśnie postanowiłem, że może warto dać jej 2 szansę i zrobić z tego coś więcej. To jest chyba dobry moment żeby powiedzieć “pokaż kotku co masz w środku” czyli o technologi słów kilka. Core gry jest napisany w C++ bo Kamil innego języka nie uznaje wiec tutaj raczej wielkiego pola manewru nie było, na moje nie szczęście do renderowania był użyty OpenGL 2.0 bo można w nim rysować prymitywy w łatwy sposób a Czołgi 12h to gównie sfery i kwadraty. Wiec przerobienie renderowania na OpenGL ES było straszna męką. Po pierwsze dlatego że trzeba było nieco inaczej podejść do renderowania obiektów. (Mamy do dyspozycji tylko VBO i o ile nie jest musem używanie VAO to jednak warto go mieć) Po drugie kod nie był do końca zgody z ObjC wiec musiałem to przerobić tak żeby odpalalo sie w okienku iPhona ( Trzeba pamiętać ze w systemach Embedded nie renderujemy na ekran a do FBO zawsze) Kolejna masakra jest fakt ze iOS “crashuje” tekstury, nie ma wogóle mowy o non power of two i do tego wszystko jest do góry nogami (o ile nie używa się zew libow do ładowania tekstur) a na koniec alpha blending jest premultipled alpha więc na dzień dobry mamy artefakty bo nasz wzór na alphe nie jest GL_SRC_ALPHA, GL_ONE_MINUS_ SRC_ALPHA a GL_ONE, GL_ONE_MINUS_SRC_ALPHA. Oryginalnie do odtwarzania dźwięku został użyty FMOD i ten sam w dla wersji iOS w początkowej fazie tworzenia prototypu, z czasem jednak musiałem przerzucić się na coś darmowego ale równie dobrego. Poszukiwania szybko doprowadziły mnie do ObjectAL bardzo przyjemnego wrappera ObjC do OpenAL z dodatkowymi bajerami. ObjectAL miał wszystko co potrzebowałem więc ruszyłem z przepisywaniem całości tak żeby można było ładować normalne modele 3D jak np 3DS Max ver 4. Interfejs gry jest napisany od zera w ObjC pewnie dlatego że jest po prostu wygodny i nie potrafię się już bez niego obyć, na szczęście Apple pozwala kompilować kod C++ i ObjC razem bo prawda jest taka ze ObjC to taka nakładka na stare dobre C a nowy standard ObjC 2.0 pozwala płynnie używać i łączyć oba języki razem. Multiplayer o tak to jest coś co chce mieć każdy i najlepiej jak by to było MMO. Podejścia do multi w tej grze były dwa oba ze stajni Apple, suma sumarum padło na gamecenter bo jest dość popularne i łatwe w implementacji a co najważniejsze nie trzeba mieć serwera, a dla gry której budżet wynosi zero złotych to dość ważne. I tu wypadało by się do czegoś przyznać pomijając tryb multiplayer z mojej pierwsze gry Supra Torque, ten tutaj był napisany prze zemnie od zera i jest to moje pierwsze podejście do tematyki multiplayera co jeszcze bardziej zwiększa u mnie poziom narcyzmu bo wyszło miodnie jak na rodziewiczenie tematu w moim wykonaniu. Oczywiście nie ma co wymagać tutaj chodzenia po wodzie sama logika jest tu dość prosta nie mamy tutaj prawdziwej fizyki w grze co pomogło dograć multiplayer bo wiele spraw jest numeryczne, kolizje są na sferach, poruszanie po mapie to pobieranie pozycji Y z heightmapy na podstawie Z i X położenia czołgu a rotacja to nic innego jak macierz obrotu z normalnej do powierzchni. Rocket sience to więc nie jest ale na potrzeby gry jest ok. Sama logika multi opiera się na przesyłaniu po UDP pozycji rotacji i najważnieszych elementów czołgu w danej klatce plus osobno info o wystrzale, podłożeniu miny itp. Ofc co jakiś czas wysyłany jest pakiet do synchronizacji co by się nie rozjechało ale 90% tego co widać na ekranie to sprytne oszustwo na zasadzie skoro nie ma fizyki a trajektoria pocisku jest zawsze liczona tak samo to wyślijmy tylko kierunek w którym poleci pocisk a reszta jakoś się policzy.
  • Język: C++, Objective C
  • Kompilator: Apple LLVM 5.0, GCC
  • IDE: Visual Studio EE, xCode 5.0.2
  • Biblioteka Graficzna: OpenGL ES 2.0
  • Biblioteka Dźwiękowa: ObjectAL
  • Narzędzia: Photoshop, Gimp, Blender, 3DS Max, Unity3D
  • Inne: B3DO Model Converter, JSON - konfiguracji / format mapy, obiektow.

Zwrot Akcji

Połowa kwietnia 2013, dostaję maila od Piotrka grafika w Flying Wild Hog i jeszcze jedno portfolio jego brata Andrzeja który pracował nad Anomaly Warzone Earth firmy 11Bit Studios, oboje chcieli pomóc mi i Kamilowi w dokończeniu gry a jako że dawno nie widziałem tak świetnych prac nie mogłem powiedzieć nie. I tu dobra uwaga, jak robisz gry to czasami po prostu warto je robić nie patrząc na to jaki będzie efekt końcowy tego co robisz i skupić się na zbudowaniu czegoś co można pokazać innym, zbudować prototyp choćby miał być obrzydliwy jak gra ma to coś to ludzie sami będą się zgłaszać z pomocą. I tak było w tym wypadku ktoś dostrzegł Iskrę dzięki której mamy teraz naprawdę fajna grę :D Niestety prawdopodobnie z powodu natłoku pracy przy Shadow Warrior, Piotrek nie mógł poświecić czasu grze ale dzięki niemu poznałem Andrzeja z którym pracuje mi się świetnie po dziś dzień. No ale skoro ma się już ekipę z która można zrobić grę to co dalej? Jako że każdy z nas ma swoje życie i Saga Tanks powstawał “po godzinach” musieliśmy przyjąć jakiś zdrowy schemat a w takich sytuacjach najlepiej sprawdza się ”nie oczekuj, nie wymagaj” w skrócie robimy kiedy możemy i wtedy kiedy chcemy. Jest to o tyle dobre że nigdy nie ma spiny jak ktoś się nie odzywa przez miesiąc bo nie wymagasz ale z drugiej strony development gry w taki sposób może trwać w nieskończoność... Grę tworzyliśmy około 8 miesięcy przy efforcie rzędu paru godzin miesięcznie zakładająć że będzie ręka sprawiedliwości w tym systemie ale nie po to żeby poganiać ale żeby weryfikować czy to w ogóle ma sens i czy idziemy w dobrym kierunku. Trzeba pamiętać że spotkania to dobra rzecz i nie można z nich rezygnować a brainstorm to nieodłączna część i nawet najgłupszy pomysł czasami zmienia wszystko nie koniecznie w ta złą stronę.

Kreatywność to przeszkoda

Oj tak to jest coś co się pojawia wszędzie, w końcu przychodzi moment żeby zaklepać ”w miarę finalny koncept gry” a i tak pod koniec zaczyna się przerabianie, ucinanie i upraszczanie. Jest taka fajna reguła która warto stosować a mówi ona: “Jak nie wiesz ile czegoś dać to daj trzy” proponuje sobie to nad biurkiem wyryć albo najlepiej dłutem na obudowie monitora, bo wielokrotnie jak będą ponosić konie umysłu to ta reguła szybko pozwala wrócić na ziemię. Ale do rzeczy jest grupka osób i prowadzą sobie taki kanał na youtube o nazwie Extra Credits jest to lektura obowiązkowa dla każdego przyszłego developera, dlaczego? Jest taki żart że użytkowników dzieli się na takich co robią kopie zapasowe i na takich co będą robić. Tak samo jest w Game Development, nie ustrzeżesz się przed pewnymi błędami póki ich nie popełnisz. A najbardziej bolesne jest to że nawet często wiedząc o czymś musisz ten błąd popełnić żeby go do końca zrozumieć. Mój kolega Tomasz Dąbrowski a.k.a. Dab kiedyś powiedział świetne zdanie “Na pewnym etapie wszystko sprowadza się do robienia simsów” i jest w tym wiele prawdy każdy by chciał mieć wszystko w swojej grze ale jak się ma wszystko to się ma nic. Iteracje to jest nieodzowna część devki, teraz pokaże może jak u nas to wyglądało. Na samym początku gra miała kamerę 3rd person a sterownie było bardzo precyzyjne i skomplikowane a sama grafika nie powalała:

Szybko jednak zrozumieliśmy że jak w to się ma dać grać to trzeba przede wszystkim dostosować grę do wyświetlaczy telefonów, dobrze sprawdzają się wyraźne w Miarę kontrastowe kolory i prosty interfejs. Po paru miesiącach prób i Błędów stworzeniu wersji na Unity w celach badawczych. Pod młot poszła grafika i sterowanie:

Powstało nawet parę testowych map ale niestety w końcowej wersji nie nadawały się do upublicznienia, więc leżą i czekają na update o to parę z nich:


Problemem wciąż było to że dynamika była ogromna a trafienie innego czołgu było jak wygranie w kumulacji totka do tego ciężko było ogarnąć skąd i gdzie do nas strzelają a wszystko dlatego że zachciało nam się hart breaking widoczków ala to:

Błędem jednak nie jest go popełnić a nie zauważyć tego że się go popełniło. Złota zasada, przyjmuj krytykę nawet jak jest bolesna, serio jak ktoś ci mówi że coś jest tragiczne to jest deal with it. Moment przełomowy jest wtedy kiedy zaczynasz pokazywać światu to co zrobiłeś. Ja na przykład uwielbiam dawać grę innym i patrzeć im na ręce jak widzę że się pocą i następuje konsternacja to znaczy że trzeba coś zmienić. Warto też czasami poprosić o pomoc, tak, tak, nie ma ludzi nie omylnych i wiadro zimnej wody to często jedyna opcja żeby wyjść z obłędu zaślepienia cudownością swojej produkcji. Takim człowiekiem na pewno jest Przemek znany innym pod pseudonimem Rezoner twórca takich hiciorów jak QbQbQb, Potato Lagoon i Jameson (i robi fajowe muzyczki :3) mój dobry przyjaciel, sąsiad, dawny współokator i ktoś kto nie zostawi na tobie suchej nitki jak mu pokażesz coś co wygląda jak pies pomielony razem z budą. Lekcja wyniesiona ze spotkania:
KISS (Keep it simple stupid) - upraszczamy ile się da im łatwiej będzie się sterować tym mniejszy rage quit.
RERF (Release early, release ofen) - Oj tak myślę że spokojnie byśmy tą gre jeszcze dłuuugo robili gdyby nie przekonywanie żeby to w końcu wypuścić.
Mechanika zawsze wygrywa z kontentem - Brutalne ale prawdziwe, jak nie masz budżetu AAA to jest to jedyna rzecz która decyduje o tym czy ktoś w to zagra.
Rezo dołącza do teamu i robi nam muzykę.

Szlify

Tak zmotywowany Andrzej zrobił w ekspresowym czasie cały nowy UI, Avatary itp, ja zmieniłem całkiem sterowanie, kamerę i usprawniłem multi i AI a Kamil mi to wszystko ładnie zoptymalizował jako że to rasowy freak jeżeli pada hasło optymalizacja. Ale wciąż bez spiny bo nie ma nic lepszego niż dobry screen na dropboxie od grafika po przebudzeniu:

I tak po ponad pół roku powstało nasze pierwsze dziecko Saga Tanks video z aktualnego Release Candidate można znaleźć TUTAJ, gra pojawi się w Styczniu 2014 roku i będzie całkowicie darmowa. Warto poruszyć jeszcze kwestie ulepszania samego gameplay’a i FX’ów
Nie ma się co okłamywać, jak masz możliwość wyboru gotowa technologia, reszta Świata to polecam Gotową technologie, serio nam Unity bardzo pomogło i choć gra na nim nie powstała to mamy dość zaawansowany prototyp tego co widać na obrazkach właśnie na Unity dlaczego? Powód jest prosty czas i prostota. Na takim Unity to i grafik ci wyklika wiele, co pozwala mu wymyślić pi razy drzwi jak to będzie wyglądać i działać albo np zrobi ci proste preview animacji drzewek, albo np przygotuje ci jak mają wyglądać wybuchy, muzzle flash, particle itp. W unity to jest parę minut i choć dla doświadczonego deva przepisanie tego na raw kod to też nie jest wiele, to jednak o wiele łatwiej jest coś suwaczkiem poprzestawiać niż kompilować na nowo builda tylko po to żeby zobaczyć czy o 10% większy kurz wygląda lepiej. O np to że Andrew mi takie fajne particle porobił w Unity zmotywowało mnie to przepisania na nowo całego systemu cząsteczek w kodzie dzięki czemu mamy tak samo sexi dynamiczny i wydajny particle engine który pozwala na płynne animacje i przejścia pomiędzy typami cząsteczek, wybuchy itd.

Co dalej ?

Rok 2014 na pewno zapowiada się ciekawie nie tylko dla nas ale i dla innych fajnych produkcji indie którym mocno kibicuje. Ja ten projekt będę zawsze dobrze wspominać dzięki niemu w końcu przełamałem moją niechęć do małych produkcji. Stworzyłem swoja pierwsza pełnoprawną grę i poznałem wspaniałych ludzi a do tego skompletowałem bardzo zgrany team o którym pewnie jeszcze nie raz będzie słychać. Dla tych którzy czytają ten art i wciąż się zastanawiają co ze sobą zrobić to polecam wybrać się na jakąś konferencje a jest ich w Polsce sporo: ZTG, WGK, IGK, GameDay, Digital Dragons itd. Na pewno każdy znajdzie coś dla siebie, pozna nowych ludzi może weźmie udział w jakims Compo albo Ludum Dare albo GGJ i tak jak ja stworzy coś z czego na pewno będzie bardzo dumny.