Materiał specjalny odnośnie nadchodzącego wielkimi krokami projektu, "Surrounded" 🚀🚀🚀! Miałem na głowie bardzo dużo pracy przez co byłem zbyt mocno zaabsorbowany, aby znaleźć dłuższą chwilę na artykuł. Te klocki są już za mną, zatem oto przed Tobą wielgachny wpis przedstawiający kulisy prac nad "Surrounded" jak rozwijała się produkcja na przestrzeni tylu miesięcy 🤩!
PRZEDSTAWIAM KULISY PRAC NAD "SURROUNDED"! ZOBACZ JAK ZMIENIAŁA SIĘ PRODUKCJA
Premiera gry już tuż tuż, a ja jeszcze przed nią wypuszczam materiał specjalny ze szczegółami produkcji 🚀! Podzieliłem treść na poszczególne elementy, takie jak bossowie czy menusy ℹ️. Nie występuje kolejność chronologiczna (czyli od momentu utworzenia projektu, do jego ukończenia w wersji 1.0), ponieważ "przeskakiwanie" pomiędzy wątkami byłoby zbyt uciążliwe, a w większości przypadków wracałem niejednokrotnie do jakiejś implementacji celem wprowadzenia poprawek 🔥. Pod każdym z tematów zostały umieszczone zrzuty ekranu z ówczesnego czasu produkcji dla wzniecenia ciekawości 😉.
Tytułem uświadomienia tematu: "Surrounded" to nadchodząca gra akcji typu "top-down shooter" ze szczyptą elementów z gier RPG bowiem zdobywamy tu doświadczenie za eliminowanie wrogów 🎯. Gracz kieruje wieżyczką i jego zadaniem jest przetrwanie określonej liczby fal przeciwników atakujących z każdej strony ekranu 💥.
Najważniejsze cechy gry to 👇:
- 2 wersje językowe z możliwością przełączania się pomiędzy nimi (nawet w trakcie gry 😎),
- 4 poziomy trudności,
- 2 tryby gry: fabularny i Przetrwania,
- system zdobywanego doświadczenia znanego z kategorii RPG,
- 8 różnych przeciwników,
- 4 rodzaje bonusów,
- 4 bossów,
- 34 odznaczenia,
- "oldschoolowa" oprawa graficzna i dźwiękowa przypominająca czasy konsoli NES z lat .80.
Zanim w ogóle zabrałem się za "Surrounded", kilka miesięcy wcześniej utworzyłem sobie osobny projekt jako szablon dla późniejszych projektów, jakie bym chciał tworzyć w "Love2D" - frameworku przeznaczonym do tworzenia gier w języku Lua wyłącznie przy pomocy kodu (czyli "po spartańsku" 💪) 🔥. Dopiero wtedy na jego podstawie, mogłem zacząć pracować już konkretnie nad samą grą w oparciu o przygotowane sceny 👍.
PODSTAWOWA MECHANIKA
Pierwszym punktem była sama podstawa do prototypu 👇:
- wieżyczka,
- przeciwnicy,
- strzelanie,
- wykrywanie kolizji,
- HUD,
- zdobywanie punktów doświadczenia,
- pojawianie się przeciwników (tzw. "spawn").
Następnie dodawało się obiekty na mapę i testowało ✅. Najpierw zaimplementowałem podstawową interakcję pocisku gracza z przeciwnikiem, a później można było przejść do atakowania wieżyczki 💥.
![]() | ![]() |
![]() | |
Zrzuty ekranu z produkcji nad "Surrounded" (podstawowa mechanika).
SAMOUCZEK
Kiedy upewniłem się, że "tłuczenie się" obu stron nawzajem działa bez zarzutu 💨, zająłem się tworzeniem okna z treścią samouczka, czyli sławny "tutorial" wprowadzający gracza w rozgrywkę 📖. W pierwszej iteracji pojawiało się okno z tekstem bez ukrywania elementów HUD'a, a później dodałem to ukrywanie, aby nie ściągało na siebie uwagi gracza, który powinien skupić się na treści porady 😊.
Małym "gotcha" był tekst informujący o naciśnięciu dowolnego klawisza, bo trzeba było uwzględnić wspierany rodzaj sterowania 😬. Jeżeli to była myszka, to miało być napisane o przycisku myszy, a jeżeli ekran dotykowy, to przekaz miał brzmieć "dotknij ekranu" 🙃.
![]() | ![]() |
Zrzuty ekranu z produkcji nad "Surrounded" (samouczek).
PRZECIWNICY
Kolejnym ważnym punktem byli przeciwnicy, a zwłaszcza ci mający zdolność do strzelania, tak jak wieżyczka sterowana przez gracza. Temat strzelających wrogów dał mi niejeden powód do zdenerwowania bowiem pojawiła się potem konieczność przerobienia ich pojawiania się na mapie w odpowiednich odstępach czasowych, aby zapobiec "zakleszczeniu" gracza ❌.
Aby dać możliwość uchronienia się przed otrzymaniem ciosu, możesz strzelić w kierunku nadlatującego pocisku, aby zniszczyły się nawzajem 💣. Problem polegał na tym, że po pojawieniu się kilku takich przeciwników strzelających z każdej strony, nie było szans osłonić się przed każdym pociskiem, choćby nie wiem jaką sprawną rękę miałby gracz 😞. Niewspółmierny wzrost siły przeciwników powodował niesprawiedliwe podejście do gracza, gdyż nakazywało to "modlić się", aby gracz zdobył bonus znacznie zwiększający siłę rażenia 😐. Nie jestem za wymuszaniem "grindingu" (sytuacja, w której gra wymusza na graczu wielokrotne powtarzanie jakichś czynności celem zwiększenia możliwości bojowych na tyle, aby móc iść dalej z postępem ℹ️), zatem nie miałem wyjścia. Musiałem gruntownie zmienić obchodzenie się ze strzelającymi wrogami 🎯.
Po modyfikacji w połowie września (ginąc ponownie nie z mojej winy podczas testów na smartfonie 📱), strzelający przeciwnicy zaczynają się przywoływać w taki sposób, aby gracz miał szansę na ich eliminację jeden po drugim ☑️. To nie znaczy wcale, że będzie można się obijać 😄. Jak się gracz nie spręży, to pojawią się następni. Natomiast zrobiło się to, co było istotne - udało się zlikwidować konieczność "pompowania" punktów doświadczenia, aby mieć cień szansy więcej na przeżycie 👍.
Jedynie w skrajnych przypadkach i podczas walki z bossem trzeba się liczyć z koniecznością umiejętnego blokowania dwóch pocisków naraz i "skakać z kwiatka na kwiatek" 🙂. Na podstawie testów stwierdzam jednak, że to się da opanować i teraz przebieg rozgrywki ma "smak" 👅. Jest chwilami ciężko, jednak przy solidnym treningu jest możliwe pokonanie wszystkich bez oberwania ani razu w głowę 💫. Gra teraz testuje umiejętności, a nie cierpliwość 😊.
Dodatkową rzeczą było dodanie jednosekundowego opóźnienia przed pierwszym wystrzałem przeciwnika, aby gracz nie był zaskakiwany lecącym pociskiem zaraz po pojawieniu się wroga na scenie ℹ️.
Odrębny krótszy epizod to Protector. Któregoś razu starałem się dobrać optymalną odległość od gracza w postaci promienia okręgu, gdyż to jedyny przeciwnik, który porusza się dookoła gracza, a nie zmierza bezpośrednio do niego. Gdybyś był(a) ciekawy(-a), to jest ostatni zrzut ekranu ℹ️.
![]() | ![]() |
![]() | |
Zrzuty ekranu z produkcji nad "Surrounded" (przeciwnicy).
TRYB PRZETRWANIA
Kolejnym krokiem był tryb Przetrwania. Tutaj jest o wiele więcej ciekawostek z produkcji, więc podzieliłem to na 3 części 😊.
BALANS TRUDNOŚCI
Tryb Przetrwania na wczesnym etapie jeszcze mocno "raczkował" i nie był jeszcze tak starannie dopracowany pod kątem bardziej pasującego dobierania przeciwników, aby sumaryczna siła oponentów nie była zbyt przytłaczająca 💪. Ponieważ jeden z pierwszych wrogów, Sentinel (taki zielony z wyraźnymi przecięciami na krzyż), może przyjąć o wiele więcej ciosów, niż Runner (brązowy z niebieskim wypełnieniem na środku) i Speeder (niebieski z kropkami w środku), miałem duże problemy z zachowaniem stabilnego wzrostu trudności 📉.
Po przywołaniu paru Sentineli, gracz na wyższych stopniach trudności miał już poczucie przytłoczenia i ledwo można było ich pokonać, tak aby nie otrzymać ciosu, a niestety dużo częściej kończyło się to przedwczesnym zgonem wieżyczki (co oczywiście wzbudzało niesprawiedliwość 🤨) 💀. Odpowiednia poprawka weszła parę miesięcy później, w której % szans na pojawienie się danego przeciwnika zależy od jego "stopnia zagrożenia" i poziomu doświadczenia gracza ✅. Wtedy dla przykładu było 40% szans na Runnera, 40% szans na Speedera i 20% na Sentinela (wartości całkiem przypadkowe) 🙂.
Nigdy nie będę w stanie zliczyć litrów wylanego potu na staranne dobieranie współczynników, aby stopień trudności rósł liniowo i żeby zminimalizować sytuacje przytłaczania gracza przez zbyt dużą liczbę przeciwników wymagających większej liczby ciosów 💦.
LIMIT STRZELAJĄCYCH PRZECIWNIKÓW
Drugim dużym problemem byli znowu strzelający przeciwnicy 🥵. W pierwszych etapach mogli przywoływać się tyle, ile chcieli 🙂. Wystarczyło kilka sztuk za dużo, aby gracz miał ogromne problemy z opanowaniem sytuacji 😬. Pojawiało się "zakleszczenie" i po kilku sekundach była pewna śmierć 💀. Ponieważ żadne umiejętności gracza przestawały się liczyć, doprowadziło to do poważnego błędu projektowego uniemożliwiającego przechodzenie gry ❌.
Rozwiązaniem okazało się wprowadzenie limitu strzelających przeciwników na mapie w jednym czasie ✅. Gdy na mapie jest dwóch strzelających wrogów, wtedy system dobiera innego przeciwnika (takiego, który nie strzela) 🧨.
WSKAŹNIK POZIOMU ZAGROŻENIA
W trybie Przetrwania, przeciwnicy zaczynają z biegiem czasu przywoływać się coraz szybciej ⏩. Oprócz tego został wbudowany specjalny "miernik" poziomu zagrożenia wpływający na prędkość przywoływania przeciwników 💥. Gdy dojdzie do 100%, przeciwnicy nacierają na gracza całymi hordami tak, aby go finalnie zgładzić 🤜, niezależnie od możliwości gracza. Tu ciekawostka - ten "łagodniejszy czas" wydłuża się wraz z liczbą odblokowanych przeciwników 😲!
Im więcej przeciwników odblokujesz, tym czas na "dojście" do 100% wskaźnika zagrożenia robi się dłuższy ⌚. Zrobiłem tak, aby zapobiec sytuacji w której gracz mógłby zgarnąć wszystkie odznaczenia za przetrwanie X minut już na samym początku gry 👍. Podstawowym założeniem było sprawienie, aby gracz po odblokowaniu wszystkich rodzajów przeciwników mógł przetrwać 5 minut, które jest taką "górną granicą" 📈.
Aby dać graczowi podgląd na rosnący poziom zagrożenia, w późniejszej fazie produkcji dodałem kolorowy pasek jako "miernik", który wypełnia się z czasem ✔️.
![]() | ![]() |
![]() | ![]() |
Zrzut ekranu z produkcji nad "Surrounded" (tryb Przetrwania).
BOSSOWIE
Jak można by przejść obok wątku prac nad walkami z bossami 🔥?
Jeszcze w pierwszym miesiącu prac udało się dojść do zmontowania walki z bossem ❤️. Pierwsza wersja to było proste zachowanie się przeciwnika w postaci powolnego zmierzania do wieżyczki i wyświetlanie paska zdrowia z jego imieniem 💪. Wtedy jeszcze dołożyłem od siebie taki bajer, że kolor paska zdrowia zmienia się z zielonego na czerwony zależnie od % pozostałych punktów zdrowia (nie ma to jak interpolacja liniowa 😄) 🤩! Potem tylko "bum" i zaliczenie etapu ✅.
Później samo "bum" zmieniłem na bardziej widowiskowe, aby boss najpierw "powybuchał", zanim ostatecznie eksploduje 😄. Wtedy na końcu odpala się gigantyczna eksplozja 💥, tak jak w wielu grach.
![]() | ![]() |
![]() | ![]() |
Zrzut ekranu z produkcji nad "Surrounded" (bossowie).
BONUSY
To może być zaskakujące, natomiast nawet bonusy były sporym wyzwaniem dla mnie jako programisty. Obiekt podnoszący graczowi szanse na przeżycie przyniósł mi dużo niespodziewanych sytuacji, o których nawet byś nie pomyślał(a) grając w tę grę 😏.
Pierwsza rzecz, pozycjonowanie 1️⃣. Bonusy w "Surrounded" są umieszczane "siatkowo". To znaczy, że zawsze umieszczane są na polach 8x8 pikseli i nie ma sytuacji umieszczenia bonusu gdzieś pomiędzy.
Druga rzecz, wykrywanie dozwolonej przestrzeni 2️⃣. Musiałem zadbać o to, aby bonusy nigdy nie nakładały się na siebie (co najwyżej znajdowały się obok siebie) 🚫. Ponadto, wprowadziłem ograniczenia dla obszaru losowania pozycji i to z obu stron 👇:
- 1 pole 8x8 pikseli od krawędzi ekranu,
- 2 pola 8x8 pikseli od wieżyczki.
Bonus pojawiający się znienacka na krawędzi nie wyglądałby elegancko, a z kolei umieszczony tuż przy wieżyczce blokowałby możliwość "niezdobywania" go (bo gracz ma takie prawo, aby zignorować dany bonus 😊) i nie byłoby żadnego momentu pomiędzy wystrzeleniem pocisku, a trafieniem bonusu przez niego (co byłoby bez sensu 🙃) ⛔.
Z ręką na sercu - gdybym Ci nie opisał tych szczegółów, pomyślał(a)byś kiedykolwiek, że biorę pod uwagę takie szczegóły 🙂?
![]() |
Zrzut ekranu z produkcji nad "Surrounded" (pojawianie się bonusów).
EFEKT DESZCZU
Deszcz pojawiający się na niektórych etapach trybu fabularnego całkiem miło wspominam od strony implementacji z powodu interesującego dla mnie podejścia 💙. Pionowa linia z "regulowaną" długością i efektem rozprysku na podłoże w postaci...elipsy 😄.
Najpierw zadbanie o sam efekt od początku do końca, a później doszło przyciemnienie ekranu, aby sugerować zachmurzenie 🎉.
![]() | ![]() |
Zrzuty ekranu z produkcji nad "Surrounded" (efekt deszczu).
SYSTEM ANDROID
Android to był jeszcze jeden "challenge" i to gruby 💪. Nie przypuszczałbym, że inna platforma niż PC może przysporzyć programiście tylu nowych dylematów, gdybym sam tego nie doświadczył 😬. Największe dwa jakie przysporzyły najwięcej problemów, to zaznaczanie opcji w menu i sterowanie kierunkiem strzelania wieżyczką 💥.
ZAZNACZANIE OPCJI W MENU
Problem polegał na tym, że niemożliwe było tylko najechać na daną opcję mając ekran dotykowy (którym od razu zaznaczamy opcję) 🤨. Robiło to o wiele większe znaczenie przy wyborze poziomu trudności, gdy po najechaniu pojawia się opis modyfikatorów, tak aby gracz wiedział na co się pisze. Bez modyfikacji, oznaczałoby to natychmiastowe wybranie stopnia trudności po pojedynczym "tapnięciu", czyli gracz musiałby podjąć decyzję "w ciemno" 😐.
Rozwiązanie jakie uznałem za kompromisowe, to wprowadzenie do menusów opcji wymagającej podwójnego naciśnięcia na opcję dotykając na nią palcem 👍. W ten sposób, za pierwszym razem przycisk był tylko "zaznaczany" na żółto (i wtedy pojawiał się opis) i dopiero za drugim razem jak się go dotknęło, to gra się rozpoczynała 🚀.
STEROWANIE PRZY POMOCY WIRTUALNEGO DŻOJSTIKA
A to była druga blokada 🔒. Nie ma myszki, nie ma grania 😅. Trzeba było zadbać o jakiś sposób komunikacji pomiędzy człowiekiem, a grą, przez smartfon. Od razu przyszedł mi do głowy pomysł na dżojstik na ekranie, czyli "joypad" 🎮! Natomiast wtedy "wyskoczyła" inna niespodzianka 😐.
Ekran gry na smartfonie jest dużo mniejszy, niż monitor "peceta" czy nawet matryca w laptopie. Mało tego, sam dżojstik nie jest pokaźnych rozmiarów (i nie mógł być zbyt duży) przez co precyzja co do skierowania ognia na przeciwników była ograniczona. Trzeba było lekko podnieść próg kolizji i tym sposobem troszeczkę ułatwić celowanie 🎯.
![]() | ![]() | |
Zrzut ekranu z produkcji nad "Surrounded" (system Android).
To wszystko. "Surrounded" z pewnością zapamiętam od strony poziomu skomplikowania, które przyniosło mi programowanie wszystkiego od zera w "Love2D". Niemniej jednak dużo się nauczyłem i poznałem proces produkcji od innej strony niż tej, która dziś dominuje (piszę o edytorach wizualnych i silnikach gier), mając do dyspozycji jedynie sam kod. Jeżeli jednak mam być szczery, to nie radzę tworzyć czegokolwiek poważnego świadomie rezygnując z wyżej wymienionych dobrodziejstw ⚠️. Jakiś mały projekt do portfolio, zgoda, ale nie coś większego - szkoda czasu 🔥! Nie wynajduj koła na nowo ❌!




















