Deep Platformer – technologiczne demo prostej platformówki

12

Biorąc pod uwagę fakt, iż moje wpisy na blogu dotyczące projektu Deep Platformer cieszyły się jakimś zainteresowaniem i że gramolę się niemiłosiernie z wydaniem końcowej wersji, podjąłem decyzję, aby już teraz opublikować wczesną wersję platformersa.

title screen.png


Deep Platformer

Deep Platformer to otwartoźródłowy projekt prostej platformówki. Pierwotnie miał to być jedynie wizualny test paralaksy oraz efektu płynnej zmiany warstwy, jednak z ciekawości i chęci eksperymentów, szybko przerodził się w coś znacznie większego.

Celem gracza jest sterowanie bohaterem w kształcie sympatycznego klocka, pokonywanie wielowarstwowych labiryntów w poszukiwaniu świetlików i bramki wyjścia. Sterowanie ogranicza się raptem do kilku klawiszy, pozwalających na chodzenie i skakanie, a także na wykorzystywanie specjalnych bramek. Dzielą się one na cztery kategorie: do zmiany warstwy, do zmiany kierunku działania siły przyciągania, do zapisu pozycji gracza oraz do wyjścia z planszy. Tylko bramka do zapisu bieżącej pozycji bohatera nie potrzebuje interakcji – pozostałe wymagają wciśnięcia odpowiedniego klawisza.

Demo składa się z intra (długiego lub krótkiego), menu, ekranów tytułowych dla różnych światów, pierwszego świata jako tutoriala (bez ekranu tytułowego), czterech światów podstawowych i jednego dodatkowego, a także siedmiu outro i creditsów. Każdy ze światów docelowo zawierać będzie po kilka poziomów, a wiele z nich również będzie wyposażonych w tematyczne, animowane cutscenki (tym zajmuję się obecnie).


Klawiszologia

Podstawowa obsługa platformówki ogranicza się do kilkunastu klawiszy. Bohaterem na boki poruszamy strzałkami, skaczemy spacją, bramek używa się strzałkami w górę i w dół (w zależności od funkcjonalności danej bramki). Rozgrywkę pauzuje się i wznawia za pomocą Escape, klawiszem F3 się ją resetuje a F4 zamyka. Klawiszami + i - zwiększa się lub zmniejsza okno. Jeśli okno nie jest rozciągnięte na pełen ekran, możliwe jest jego przesunięcie za pomocą myszy, na dowolny ekran.

Klawisze Escape i Space służą też do przyspieszania (a raczej pomijania) animacji.

Pełna lista klawiszy (również tych służących do debugowania) znajduje się w pliku readme.txt. Docelowo ten plik będzie zawierał pełen opis gry, ale póki co posiada tylko listę klawiszy.


Technikalia

Projekt w całości został napisany we Free Pascalu (Lazarus 1.8.4) i dzieli się na sześć różnych aplikacji – pięciu generatorów oraz głównej gry. Gra służy do grania (a jakże), a generatory do tworzenia binarek z jej zawartością. Kod źródłowy wszystkich wymienionych aplikacji możliwy jest do skompilowania do postaci 32- i 64-bitowej. Niestety, z racji konstrukcji kodu obsługi okna, jedyną wspieraną platformą jest Windows. Szkoda… :/

Wiele informacji na temat niecodziennych założeń oraz historii tworzenia tego pojektu podałem w moim ciągu wpisów na blogu, więc zainteresowanych takimi informacjami odsyłam do tych materiałów. Na blogu znajdziecie też zrzuty ekranu oraz fragmenty kodu. Natomiast jeśli ktoś ma jakiekolwiek pytania na temat technicznych aspektów tego projektu to z chęcią odpowiem na każde z nich.

Demówka jest przenośna (portable) – nie wymaga żadnego instalowania i nie zapisuje żadnych informacji na dysku użytkownika. Można ją uruchamiać z dysku lokalnego, z pendrive'a, a nawet z CD (jeśli ktoś jeszcze pamięta co to).


Kod źródłowy

Źródła głównej aplikacji (docelowej gry) składają się z 33 modułów, o łącznej liczbie linii równej 11.133:

  • Platformer.Main.lpr – główny moduł projektu,
  • Platformer.Window.pp – zawiera klasę formularza i jego obsługi,
  • Platformer.CommandLine.pp – zawiera klasę do obsługi linii poleceń,
  • Platformer.UserInterface.pp – zawiera klasę do manipulacji rozmiarem i pozycją okna,
  • Platformer.Game.pp – zawiera główną klasę gry,
  • Platformer.Scenes.pp – zawiera zestaw klas dla wszystkich scen gry,
  • Platformer.Story.pp – zawiera zestaw klas do obsługi fabuły gry i zarządzania nazwami plików,
  • Platformer.Buffers.pp – zawiera obiekty tylnych buforów oraz klasę bufora cyklicznego z templatkami szumu,
  • Platformer.Renderers.pp – zawiera klasy służące do renderowania wszystkiego co widoczne na ekranie,
  • Platformer.Time.pp – zawiera klasę głównego zegara utrzymującego zadany klatkaż,
  • Platformer.Fonts.pp – zawiera klasy reprezentujące fonty,
  • Platformer.Input.pp – zawiera drzewko klas do obsługi klawiatury,
  • Platformer.Cheats.pp – zawiera klasę do manipulowania trybem cheatowania (debugowania),
  • Platformer.Animations.pp – zawiera klasy do opisu wszelkich animacji (cutscenek),
  • Platformer.TitleScreens.pp – zawiera bazową klasę dla ekranów tytułowych,
  • Platformer.Sprites.pp – zawiera klasy przechowujące sprajty bohatera i świetlików,
  • Platformer.Levels.pp – zawiera klasy reprezentujące wielowarstwowy poziom,
  • Platformer.Slots.pp – zawiera klasę przechowującą dane na temat pozycji gracza (save slot),
  • Platformer.Worlds.pp – zawiera klasę opisującą ekran tytułowy dla światów,
  • Platformer.Menu.pp – zawiera klasę obsługi głównego menu gry,
  • Platformer.Camera.pp – zawiera klasę przechowującą dane na temat kamery,
  • Platformer.Gates.pp – zawiera zestaw klas do opisu bramek zmiany warstwy, grawitacji, zapisu oraz wyjścia,
  • Platformer.Fireflies.pp – zawiera klasy reprezentujące pojedynczy świetlik oraz ich listę,
  • Platformer.Hero.pp – zawiera klasy przechowujące dane na temat pohatera,
  • Platformer.Pause.pp – zawiera klasę przechowującą dane na temat zapauzowań rozgrywki,
  • Platformer.Counters.pp – zawiera klasy z danymi na temat liczby zgonów oraz zebranych świetlików,
  • Platformer.Scores.pp – zawiera klasy przechowujące statystyki gracza dla danej sesji,
  • Platformer.Movements.pp – zawiera klasy służące do modyfikacji pozycji gracza oraz świetlików,
  • Platformer.Collectors.pp – zawiera klasy z wydzieloną logiką kolekcjonowania (póki co tylko świetlików),
  • Platformer.Utils.pp – zawiera zestaw uniwersalnych subrutyn do przetwarzania bitmap,
  • Platformer.Types.pp – zawiera kilka typów danych, wymaganych głównie do renderowania tekstu,
  • Platformer.Helpers.pp – zawiera klasy helperów dla typów prostych i klas z biblioteki standardowej,
  • Platformer.Constants.pp – zawiera mnóstwo stałych, służących do kalibrowania gry i wielu jej elementów.

Generatory to dość proste aplikacje konsolowe, o specyficznej budowie i sposobie użycia. Składają się raptem z kilku modułów, a kod każdego z nich napisany jest w takim samym stylu.

Kod źródłowy nie zawiera żadnych komentarzy (nie licząc informacji o twórcy i licencji w każdym module). Nigdy ich nie dodaję, wzamian staram się pisać kod w taki sposób, aby sam informował o swoim przeznaczeniu. W razie czego pytać o szczegóły.


Uniwersalne fragmenty kodu

Projekt nie zawiera zbyt wiele fragmentów kodu, które możnaby zastosować w innych projektach, np. w zwykłych aplikacjach okienkowych. Jedyne moduły, których zawartość może być faktycznie przydatna, to Platformer.Utils.pp oraz Platformer.Helpers.pp. Znajdziecie tam praktyczne przykłady użycia metody ScanLine i efektywnej obróbki bitmap, a także przykłady rozszerzania typów prostych o dodatkowe metody.


Dalsze plany

Prace będą kontynuowane jedynie do ukończenia pierwszej wersji z pełną, docelową zawartością. Jak już wszystkie binarki m.in. z poziomami i animacjami zostaną ukończone, projekt wyląduje na GitHub (który posłuży tylko jako taki backup, bo w przyszłości nie zamierzam go rozwijać). Przetestowałem to co chciałem przetestować (a nawet o wiele więcej), a to co trafi do repozytorium, najpewniej już nigdy nie będzie przeze mnie aktualizowane.

Źródła udostępniam na licencji GPL, więc każdy chętny będzie mógł forknąć repozytorium i stworzyć coś swojego. Ewentualni moderzy będą mieli prostą drogę do przeróbek, za sprawą otwartego kodu źródłowego i dostępu do narzędzi, z których i ja korzystam. Oczywiście informacje na temat używania generatorów i tworzenia plików konfiguracyjnych znajdą się docelowo w plikach readme.txt (póki co są puste, a uzupełnię je na samym końcu).


Załączniki

deep platformer – release.zip

Zawiera skompilowaną wersję platformówki, bez źródeł. Niektóre pliki są jeszcze nieuzupełnione. Do dyspozycji są dwa pliki wykonywalne i oba zawierają to samo, tyle że ten z postfiksem debug ma włączony stały tryb debugowania, dzięki czemu można się pobawić również dodatkowymi opcjami.

Pliki wykonywalne nie są podpisane cyfrowo, do tego są skompresowane za pomocą UPX, więc oprogramowanie antywirusowe oraz pewne usługi Windows mogą ostrzegać przed potencjalnie szkodliwą zawartością. Pliki te są jak najbardziej czyste, nie zawierają żadnych wirusów.

deep platformer – mirror.zip

Jest to kopia całego katalogu z projektem, zawiera pełne źródła wszystkich aplikacji, skompilowane pliki wykonywalne oraz pliki konfiguracyjne (i nie tylko) dla generatorów, do tworzenia testowej zawartości. Jednym słowem wszystko co potrzebne do zbudowania gry i tworzenia zawartości.

Zawiera też skróty do generatorów (*.lnk) z ustalonymi parametrami, tak aby móc tworzyć binarki dwuklikiem, bez koniczności otwierania konsoli i ręcznego podawania parametrów ze ścieżkami (a te są dość długie). Skróty powłoki zawierają ścieżki relatywne, więc śmiało można z nich korzystać.


Have fun. ;)

2

u mnie działa :)

1

Uściślając – gra będzie działać na dowolnym komputerze z systemem Windows, poczynając co najmniej od WinXP, aż po Win10 (w załącznikach pliki wykonywalne są 32-bitowe). Bez problemu się uruchomi i będzie działać prawidłowo – chyba że jakiegoś ważnego pliku braknie, wtedy strzeli focha i się po prostu wyłączy. ;)


To co może bardzo przeszkadzać to ”skacząca” animacja przewijania poziomu podczas ruchu bohatera oraz efekt rozrywania obrazu. Przewijanie poziomu ładnie (płynnie) wygląda na matrycach z wysokim czasem reakcji (głównie matowych lub po prostu starych), więc jeśli ktoś taką posiada, to może sobie okno gry na nią przeciągnąć. No i jasna sprawa – im mniejsze okno, tym mniej widoczne defekty animacji.

Natomiast w razie problemów z płynnością animacji lub wnerwiającą linią spowodowaną rozrywaniem obrazu, można spróbować uruchomić grę z okresleniem niższego klatkażu:

> platformer.exe framerate pal

Wtedy gra działać będzie z prędkością pięćdziesięciu klatek na sekundę, co owy pal symbolizuje. Tu niespodzianka, bo niższy framerate to wolniejsze działanie gry (o kilkanaście procent) – można poczuć dawny klimat na odpierdziel portowanych gier z NES-a na Famicoma. ;)

W wersji z permanentnym trybem debugowania, w miejsce pal można podać liczbę z zakresu od 1 do 60.

Parametrów możliwych do podania z linii poleceń (lub skrótu powłoki, co w sumie na jedno wychodzi) jest więcej – w razie czego mogę je też podać. Ewentualnie można je wykukać w źródłach projektu (opcja dla hakerów).

0

Przeszedłem :-)
Pomysł na światy (te same) w różnych kolorach. Jak na moim Atari i grach ładowanych z kaset magnetofonowych :-D Dwa pytania:

  • Na końcu jest 'score' i coś jeszcze ale niechcący kliknąłem i zniknęło, a nie zauważyłem punktacji?
  • Dlaczego ten botnet żre 14% z mojego stacjonarnego procesora?
3
Hispano-Suiza napisał(a):

Pomysł na światy (te same) w różnych kolorach. Jak na moim Atari i grach ładowanych z kaset magnetofonowych :-D

No tak, poziomy przede wszystkim będą się różnić kolorem tła, ale nie tylko. Póki co platformy są kwadratowe, zgodne z hitboksami, ale docelowo będą posiadać nieregularne kształty (np. trawka, krzaczki, kamienie, liany itd.), które nie będą podlegać kolizji.

To co obecnie gra posiada, czyli poziomy o dokładnie takiej samej zawartości, bez możliwości zmiany warstwy i kierunku przyciągania, służy tylko do testowania (krótkie, bo ostatnio sprawdzałem działanie klasy fabuły i punktacji). Docelowo będą o wiele bardziej ciekawe, z pełną funkcjonalnością i konkretnymi grafikami platform. Odcienie teł i styl ich gradientów mogą jeszcze ulec zmianie. Choć i tak pewnie nikt nie zauważy(ł), że tło jest gradientem. ;)

  • Na końcu jest 'score' i coś jeszcze ale niechcący kliknąłem i zniknęło, a nie zauważyłem punktacji?

To było outro z tymczasową informacją o tym, czy zatłukłeś bohatera co najmniej raz i czy zebrałeś wszystkie świetliki. Tylko takie informacje gra kolekcjonuje w danej sesji i używa ich tylko do dwóch rzeczy:

  • do określenia czy gracz zasłużył na dodatkową zawartość (obecnie: na dodatkowy świat),
  • do określenia które outro pokazać.

Podczas rozgrywki, w lewym górnym rogu widoczne są liczniki – jeden z liczbą zgonów, a drugi z liczbą zebranych świetlików. Polecam pobawić się wersją z włączonym trybem debugowania – w niej można manipulować stanem liczników.

  • Dlaczego ten botnet żre 14% z mojego stacjonarnego procesora?

Zapomniałem dodać – gra w tle kopie bitcoiny. Nie przejmuj się, u mnie żre 50%! ;)

A tak na poważnie – platformówka zawsze zjada całą dostępną moc jednego jądra procesora (nawet pisałem o tym na blogu). Głównym powodem takiego stanu rzeczy jest zbyd czasochłonne przetwarzanie i renderowanie grafiki, co wyklucza możliwość użycia procedur oczekujących, takich jak Sleep. A jest zbyt czasochłonne, bo w całości wykonywane jest przez CPU (jak wspomniałem, jednym z założeń było nieużywanie bibliotek do tworzenia gier).

Sleep używa zegara systemowego, o zbyt niskiej częstotliwości, przez co w przypadku tego projektu nie da się go wykorzystać do oczekiwania mniej niż 10ms. Gra na słabszych komputerach zużywa grubo ponad 10ms do przetworzenia grafiki, co zmusza do oczekiwania na kolejną klatkę nawet przez mniej niż milisekundę (w niektórych przypadkach). Dlatego mechanizm oczekujący na kolejną klatkę to po prostu zwykła pętla, ciągle sprawdzająca liczbę ticków procesora i to ona odpowiada za pełne zużycie mocy.

Taka konstrukcja zegara jest jednym z założeń – chciałem zaimplementować ”zegar” maksymalnie podobny w działaniu do tego z Famicoma. Na tej platformie nie używało się delty i wielowątkowości, a oczekiwało na sprzętowe przerwanie odblokowujące PPU (tzw. NMI). Wyszło elegancko, choć to takie zupełnie niedzisiejsze. W razie czego ten retro-smaczek znajdziecie w źródłach (i nie tylko ten).

6

Nie mogę znaleźć mikropłatności, wtf? to jakiś bug?

1

Damn it… zapomniałem… :/

W sumie to to co obecnie dodałem do załączników, co najwyżej w połowie oddaje wartość tego projektu. Sama ”labiryntowata” konstrukcja poziomów z nieregularnymi kształtami platform, ukrytymi przejściami i wieloma grywalnymi warstwami, a także cutscenki, powinny dość mocno uatrakcyjnić całość. Muszę je tylko skończyć…

Ewentualnie postaram się co nieco pokazać wcześniej, zanim skończę wszystkie poziomy.

0

Czy jesteś już na emeryturze, czy po prostu nie zajmujesz się żoną i dziećmi :D ?

Bo jednak to:

  • tworzenie gry non-profit;
  • takie szczegółowe opisy.

Trochę czasu to zajmuje...

3
Spine napisał(a):
  • tworzenie gry non-profit;

Jeśli podzieli się liczbę linii kodu na liczbę dni spędzonych przy tym projekcie, to wyjdzie niewiele. Zresztą mnie pisanie kodu trudno nie przychodzi, po prostu siadam i piszę. Poważnych problemów z błędami w świeżo napisanym kodzie raczej nie miewam, więc mogę w kilka godzinek nastukać nawet tysiąc linijek działającego kodu (pod warunkiem, że dany algorytm z założenia musi działać i dokładnie wiem co mam zrobić).

Mimo wszystko nie wyszło mi to wcale tak szybko – projekt miał być gotowy grubo ponad miesiąc temu.

A jeśli o przydługie odpowiedzi na forum chodzi, to mam już w tym wprawę – odpowiadanie w wielu wątkach jednocześnie uczy szybkiego pisania, również jeśli chodzi o znaczniki formatowania tekstu.

  • takie szczegółowe opisy.

Cache to podstawa – pierwszy post zalegał dwa dni w notatkach Opery. ;)

1

Przysiadłem do tematu – zrobiłem sześć poziomów pierwszego świata, który służy jako tutorial.

Na razie platformy są zgodne z hitboksami (a więc zbudowane z kwadratów), bo ostateczne szczegóły takie jak trawa, krzaki, drzewa, kamyki itd. będą malowane na samym końcu, jak już będę miał przygotowane wszystkie poziomy wszystkich światów.

Ogólny zamysł na wygląd platform jest taki, aby sprawić wrażenie przebywania wewnątrz trójwymiarowej ”bańki”. Można powiedzieć, że silnie inspiruję się grą Limbo. Z tego powodu jeśli bieżąca warstwa posiada np. funkcjonalną półkę, to warstwa dalsza posiada jej dalszy ciąg. Jeśli mamy wąskie przejście, to zwęża się ono wizualnie z każdą dalszą warstwą. Bardzo fajnie to wygląda w połączeniu z efektem paralaksy. Docelowy kształt platform może się jeszcze nieco zmienić (jeśli chodzi o kwadraty, bo detale w postaci upiększających obiektów na pewno będą domalowane).

preview.png

Poziomy pierwszego świata (tutoriala) będą docelowo wyposażone w animowane przerywniki, tłumaczące w jaki sposób grać, ale tych jeszcze nie zrobiłem. Tak jak poprzednio – strzałki na boki służą do chodzenia, strzałki góra/dół do używania bramek i spacja do skakania. Czwarty poziom tutoriala zawiera pewien smaczek, ale nie będę go zdradzał – próbuj. ;)

Pozostałe światy posiadają krótkie, testowe poziomy – takie jak wcześniej.


Do załączników wrzucam dwa archiwa:

I tak jak poprzednio – w wersji release plik wykonywalny jest spakowany za pomocą UPX, a wszystkie exeki nie posiadają podpisu cyfrowego, więc zignorujcie ostrzeżenia przed potencjalnie szkodliwą zawartością.

0

Ściągnąłem, pograłem. Całkiem spoko.

Doszedłem do planszy, gdzie jest przepaść. Niestety wyskok nie bardzo chce działać na krawędziach. Jak stoję i się nie poruszam to mogę podskoczyć w górę, ale skakanie "w biegu" w prawo po prostu nie chce zatrybyć.
screenshot-20181115171131.png

Może pozwól na skok jeszcze przez 0.15s od momentu stracenia gruntu pod nogami? To by drastycznie zwiększyło mobilność postaci ;)

Dopiero po wielu próbach przez przypadek wskoczyłem w planszę (pewnie to zamierzone?):
screenshot-20181115171416.png

Fajny ten mechanizm Deeper/Nearer ;)

2
Spine napisał(a):

Doszedłem do planszy, gdzie jest przepaść.

To właśnie ta plansza z niespodzianką. Miło widzieć, że zdałeś test – ta plansza w założeniu ma wkurzyć gracza i pochłaniać około 8-10 żyć, zanim w przerywniku zostanie wytłumaczone o co chodzi.

Niestety wyskok nie bardzo chce działać na krawędziach. Jak stoję i się nie poruszam to mogę podskoczyć w górę, ale skakanie "w biegu" w prawo po prostu nie chce zatrybyć.

Nie jest to celowy zabieg – tak po prostu wyszło. Wiem że taki ”efekt” istnieje, ale nie wiem czy go usuwać czy pozostawić. IMO powinien on zostać. Z rozbiegu trzeba się dobrze wybić, a jak dobrze wybić, to stojąc twardo na platformie.

Może pozwól na skok przez 0.15s od momentu stracenia gruntu pod nogami? To by drastycznie zwiększyło mobilność postaci ;)

Ooo nie, musi być surowo i bezwzględnie – jak za starych dobrych czasów.

Dopiero po wielu próbach przez przypadek wskoczyłem w planszę (pewnie to zamierzone?):

Ten poziom da się przejść na dwa sposoby – albo przeskakując nad przepaścią (tak, da się), albo górą, przez ukryte przejście. Tak, to zamierzone. ;)

2

DISCLAIMER: Nie czytałem wcześniejszej dyskusji

Podoba mi się nieoczywista mechanika skakania, im dłużej przytrzymana spacja tym wyżej postać skacze. Szybkie "pacnięcie" o spację powoduje mały podskok. Podoba mi się jak postać się wydłuża podczas spadania, screen niżej. Pytanie czy będąc dłuższym podczas spadania powiększamy nasz hitbox? Nie sprawdziłem jeszcze. Jestem niemal pewien, że nasza postać nie może podskoczyć z samego kantu podłogi gdy jest w ruchu. Próbowałem kilkanaście razy i wydaje mi się, że mam dobry timing. Ale żeby być 100% pewnym musiałbym nagrać wideo i zarejestrować klatkę w której wcisnąłem spację - raczej nie będzie mi się chciało w to bawić, wybacz :/ W stanie statycznym nie ma problemu.

EDIT doczytałem niektóre posty wcześniej.
Apropos tego kantu i odbijania

IMO powinien on zostać. Z rozbiegu trzeba się dobrze wybić, a jak dobrze wybić, to stojąc twardo na platformie.

@furious programming chcesz implementować realizm w zręcznościowym platformerze składającym się z kwadratów? Nie tędy droga my friend. To pogrywanie z przyzwyczajeniami graczy i budowanie frustracji w imię nie wiadomo czego. To zupełnie inny przypadek niż z tą przepaścią, tam informujesz gracza, że to miało jakiś głębszy sens, a tutaj?

Apropos

ta plansza w założeniu ma wkurzyć gracza i pochłaniać około 8-10 żyć, zanim w przerywniku zostanie wytłumaczone o co chodzi.

Za dużo. Wyłączyłem grę po czwartym pudle. Pięć straconych żyć to maks.

screenshot-20181123093606.png

1
several napisał(a):

Podoba mi się nieoczywista mechanika skakania, im dłużej przytrzymana spacja tym wyżej postać skacze. Szybkie "pacnięcie" o spację powoduje mały podskok.

IMO to jest obowiązkowa funkcjonalność, nie ficzer. Każda platformówka, nawet tak prymitywna jak Mario na NES-a, posiadała regulowaną wysokość skoku.

Podoba mi się jak postać się wydłuża podczas spadania, screen niżej. Pytanie czy będąc dłuższym podczas spadania powiększamy nasz hitbox? Nie sprawdziłem jeszcze.

Nie, hitboks ma zawsze stały rozmiar, wynoszący 14x16 pikseli, czyli tyle, ile zajmuje na ekranie ciało bohatera w bezruchu. To znacznie upraszcza wykrywanie i przeprowadzanie kolizji – dlatego jego rozmiar jest niezmienny. W trybie debugowania łatwo to sprawdzić:

falling.png

W ten sposób przy okazji można wybadać, że hitboks zawsze znajduje się w środku rozciągniętego ciała bohatera. Co oznacza, że wizualnie ciało rozciągnięte jest w obie strony (w górę i w dół) względem hitboksu. Po to, aby ten sam sposób renderowania można było wykorzystać przy odwróconym kierunku siły przyciągania.

Podczas chodzenia ciało bohatera kurczy się i rozpręża, ale też tylko wizualnie.

Jestem niemal pewien, że nasza postać nie może podskoczyć z samego kantu podłogi gdy jest w ruchu.

To prawda, już tłumaczę dlaczego tak się dzieje.

Chodzi o kolejność metod modyfikujących pozycję gracza w ruchu. Najpierw wykonywane jest przesunięcie względem osi X, a następnie względem osi Y. To powoduje, że będąc na samym kraju platformy podczas ruchu, bohater najpierw przesuwany jest w bok, co sprawia, że przestaje już stać na platformie w kolejnej metodzie, czyli aktualizującej pozycję Y bohatera. A to powoduje, że skok nie jest już możliwy, bo bohater znajduje się w powietrzu.

Jeśli zmieni się kolejność wykonywania tych metod, to boahter nie będzie w stanie wskoczyć w poziomą szczelinę o wysokości jednego kafla, czyli o wysokości ciała bohatera (a raczej hitboksu).

Ale żeby być 100% pewnym musiałbym nagrać wideo i zarejestrować klatkę w której wcisnąłem spację - raczej nie będzie mi się chciało w to bawić, wybacz :/

Od tego jest tryb debugowania (wbudowany cheat mode) i możliwość spowalniania odtwarzania gry nawet do jednej klatki na sekundę. To pozwala klatka po klatce prześledzić co tylko się chce, w tym ruch bohatera.

@furious programming chcesz implementować realizm w zręcznościowym platformerze składającym się z kwadratów?

To była ironia, widać nieoczywista. :P

Wszystko co dotyczy wizualnych aspektów ruchu bohatera, jest silnie związane z implementacją metod aktualizujących pozycję gracza i przeprowadzających kolizje. Tu nie ma żadnej magii – po prostu tak został zaimplementowany silnik. Zastanowię się jeszcze nad zmianą tego mechanizmu.

Za dużo. Wyłączyłem grę po czwartym pudle. Pięć straconych żyć to maks.

Ten poziom w założeniu miał nie dopuścić do przeskoczenia tej przepaści. Każdy, nawet najbardziej precyzyjny skok miał wyglądać tak, jakby brakło dosłownie piksela do wylądowania na platformie. Ona nie miała służyć do ćwiczenia skoku, a do odkrycia ukrytego przejścia, co @Spine dokonał. W razie gdyby gracz był uparty i ciągle próbował przeskoczyć tę przepaść, po 8-10 zgonie miała się wyświetlić cutscenka z informacją, że u góry jest ukryte przejście i aby przejść ten poziom, należy z niego skorzystać.

Ale że podczas testowania cutscenek przez przypadek udało mi się ją przeskoczyć, używając skoku o niepełnej wysokości, to lekko zmodyfikowałem przeznaczenie tego poziomu i dostosowałem cutscenki do obecnej sytuacji. ;)


Edit: a tak swoją drogą, to cutscenki dla całego tutoriala powinny być gotowe dzisiaj. Wtedy też wrzucę nowe źródła do testowania i napiszę o tym, co nowego jeszcze zdążyłem dodać do gry.

5

Ok, skończyłem wstępną wersję pierwszego świata, czyli tutoriala. Teraz – oprócz poziomów – dostępne są też animowane cutscenki tłumaczące graczowi w jaki sposób grać. Wszystkie poziomy tego świata są w nie wyposażone – niektóre tylko w intro, a niektóre też w outro lub opcjonalne cutscenki odtwarzane po wpadnięciu w przepaść.

cutscene.png

Skorzystałem z rady @several i kilka zgonów wcześniej wyświetla się podpowiedź co do ukrytego przejścia. :P

Co prawda jeszcze kilka cutscenek dodam do tutoriala, ale tylko tych dotyczących śmierci gracza, bo główne są już dobrane i skalibrowane. Zmienią się też nieznacznie obrazki poziomów w tych animacjach, dlatego że na nich platformy nie mają namalowanych detali, a tym zajmę się na samym końcu, pisałem już dlaczego.


Oprócz zrobienia cutscenek, dodałem co nieco do kodu źródłowego gry. Aby móc łatwiej debugować animacje i poziomy, dodałem obsługę kilku nowych klawiszy. Teraz klawisze F5, F6 i F7 umożliwiają odpowiednio powrót do poprzedniego poziomu, zresetowanie go lub przejście do kolejnego. Natomiast klawisze F9, F10 i F11 pozwalają manipulować całymi światami (tak samo: powrót do poprzedniego, zresetowanie lub przejście do następnego). Wszystkie funkcje działają w obrębie jednego rozdziału.

Poprawek w kodzie było nieco więcej. Dziś przez przypadek odkryłem bug, który powodował, że cały ekran wypełniany był kolorem czarnym, zamiast kolorowymi platformami. Okazało się, że wywołanie Bitmap.BeginUpdate i następnie Bitmap.EndUpdate, bez malowania czegokolwiek, powodowało taki glitch. Występował on wyłącznie w trybie debugowania (wbudowany cheat mode), przy włączonej funkcji pokazywania bramek i tylko wtedy, gdy renderowana bitmapa (tu: litera bramki) znajdowała się dokładnie jeden piksel pod ekranem. Bradzo rzadko wystepujący bug, ale na szczęście trafiłem na niego i go szybko usunąłem.

Zmodyfikowałem też nieznacznie mechanizm uruchamiania wbudowanego trybu debugowania, tak aby upodobnić go do tych spotykanych w starych grach na stare konsole. Teraz ten fragment gry wygląda o wiele lepiej. Ale nic więcej nie powiem na ten temat.

No i wszystkie pliki readme.txt (jest ich sześć) są w końcu uzupełnione, więc można sobie poczytać o różnych rzeczach dotyczących gry i generatorów. Tego mi długo brakowało, więc cieszę się, że je uzupełniłem. Tym bardziej, że podczas tworzenia poziomów tutoriala i cutscenek dla niego, bardzo mi się przydały.


To by było na tyle, nareszcie mogę przejść do następnego kroku, czyli do projektowania poziomów dla właściwej części rozgrywki (drugiego i trzeciego rozdziału).

Jeśli ktoś chce przetestować nowinki, to do załączników dodaję znów dwa archiwa – release jako sama gra oraz mirror będący kopią całego katalogu projektu. Feedback jak zwykle mile widziany. ;)

2

Działa pod wine (Linux Mint), wystarczy rozpakować i napisać:

wine platformer.exe

Po dwudziestym skoku w przepaść się poddałem :)

0
furious programming napisał(a):
several napisał(a):

Podoba mi się nieoczywista mechanika skakania, im dłużej przytrzymana spacja tym wyżej postać skacze. Szybkie "pacnięcie" o spację powoduje mały podskok.

IMO to jest obowiązkowa funkcjonalność, nie ficzer. Każda platformówka, nawet tak prymitywna jak Mario na NES-a, posiadała regulowaną wysokość skoku.

No widzisz, masz rację. Ja z platformówek tłukłem "Jazz Jackrabbit" gdzie obowiązywał double jump. Wstyd się przyznać, ale nie byłem specjalnie świadom tej mechaniki z przytrzymaniem klawisza skoku. W platformery, które grałem zawsze był double jump.

Nie, hitboks ma zawsze stały rozmiar, wynoszący

No i spoko, zwracając na to uwagę nie miałem na myśli, że to coś złego. Po kilku minutach w grze, wolałbym żeby hitboks był stały ;)

A samouczek jest naprawdę spoko, wszystko wyjaśnia i nie miałem wrażenia że jest przydługi. Zdradziłeś w nim pomysł na grę czyli przeskakiwanie w głąb lub bliżej dzięki czemu zwróciłem uwagę na tło i fakt że nie jest ono tak statyczne i płaskie jak z początku myślałem. Świetna rzecz. W połączeniu ze zmianą grawitacji i poruszaniu się po suficie dało to efekt zaburzenia mojej pewności siebie wynikającej z wcześniejszych oczekiwań wobec platformera, ale to bardzo pozytywna rzecz! Zrobiłem się ciekawy, co czeka mnie dalej. Gratuluje ;)

Uwagi. Cytat z samouczka just make friends with vertical camera. Proponowałbym raczej just get familiar with vertical camera.
Punkty "save", "nearer", "deeper" da się ominąć skokiem i można je przegapić. Sam nie jestem pewien na ile to może wpłynąć na niepotrzebną frustrację, bo grywalny jest tylko samouczek, ale w przypadku ominięcia punktu "save" i konieczność przechodzenia dłuższej drogi niż gracz w założeniu powinien oraz poźniejsze odnalezienie tego punktu "save" może wywołać rzuceniem fucka ;) Tak samo jak dłuższe szukanie przejścia "deeper/nearer" znajdując go w miejscu gdzie było się już piętnaście razy. Ale może to też być takim dodatkowym smaczkiem w grze ;) Ciężko powiedzieć.

1

Dzięki @vpiotr za sprawdzenie pod emulatorem – fajnie, że wszystko gra. :)

vpiotr napisał(a):

Po dwudziestym skoku w przepaść się poddałem :)

Po piątym wpadnięciu w przepaść wyświetlana jest cutscenka z informacją co do ukrytego przejścia („dla mięczaków”, jak to ująłem). Jeśli się z niej nie skorzysta i mimo wszystko spróbuje przeskoczyć kolejny raz, to po następnym wpadnięciu w przepaść, cutscenka informuje o tym, aby użyć niższego skoku – w ten sposób da się bez problemu przeskoczyć. Ogólnie chodzi o to, aby nie uderzyć głową w platformę, bo przy uderzeniu od razu odwracany jest kierunek ruchu w pionie, co skutkuje wcześniejszym opadaniem – i wtedy brakuje kilku pikseli aby dolecieć do platformy po drugiej stronie.

Trzeba po prostu nabrać wprawy w regulowaniu wysokości skoku i do tego właśnie ten poziom służy. A dla tych, którym skok nie będzie wychodził, istnieje ukryte przejście. Ono też ma swoje przeznaczenie – ma pozwolić ukończyć poziom oraz poinformować gracza, że nie wszystko co czarne to solidna ściana. Jeden poziom, a trzy różne funkcje.


several napisał(a):

A samouczek jest naprawdę spoko, wszystko wyjaśnia i nie miałem wrażenia że jest przydługi.

Najbardziej dało mi w kość intro do piątego poziomu, w którym informuje się gracza o bramkach do zmiany warstwy, grawitacji i autozapisu pozycji. Wstępna wersja zawierała z dziesięć ekranów z tekstem i zrzutami. Chciałem uniknąć nudnego stukania w spację – mnie strasznie wnerwiają napisy w grach, a im dłuższe, tym mniejszą mam ochotę na ich czytanie. Dlatego pozbyłem się ich nadmiaru, ograniczając intro tego poziomu do niezbędnego minimum.

Zdradziłeś w nim pomysł na grę czyli przeskakiwanie w głąb lub bliżej dzięki czemu zwróciłem uwagę na tło i fakt że nie jest ono tak statyczne i płaskie jak z początku myślałem.

Dosyć długo utrzymywałem to w tajemnicy. Pisałem na blogu o różnych tego aspektach, ale nie pisałem o możliwości przełączania warstw. Zdradziłem to dopiero w którymś wpisie z kolei – wtedy silnik już w pełni obsługiwał wielowarstwowe poziomy, a tryb debugowania pozwalał na przełączanie się pomiędzy nimi (obsługi bramek jeszcze nie było). We wskazanym wpisie jest nagranie pokazujące obsługiwany efekt paralaksy i właśnie przełączania się pomiędzy warstwami.

Ale nie wszystko zdradziłem, co dotyczy mechaniki i poziomów, więc jeszcze dużo pozostanie do odkrycia.

Świetna rzecz. W połączeniu ze zmianą grawitacji i poruszaniu się po suficie dało to efekt zaburzenia mojej pewności siebie wynikającej z wcześniejszych oczekiwań wobec platformera, ale to bardzo pozytywna rzecz!

Możliwość zmiany warstwy była głównym celem stworzenia tej demówki. :]

Uwagi. Cytat z samouczka just make friends with vertical camera. Proponowałbym raczej just get familiar with vertical camera.

Tutaj miałem spory dylemat, skorzystałem z tłumacza Google i zasugerowałem się jego podpowiedzią. Ale dobra uwaga – faktycznie większy sens ma to co proponujesz, dzięki!

Przy okazji – zgubiłeś końcowe słówko movement. :P

Punkty "save", "nearer", "deeper" da się ominąć skokiem i można je przegapić. […]

Tak, póki co w ogóle nie wiadomo gdzie znajdują się bramki. Docelowo jednak platformy będą posiadać domalowane drobne obiekty, takie jak kamienie, trawa, krzaki, korzenie, drzewka itd., które zamierzam wykorzystać do ozdobienia bramek, w celu ich uwidocznienia. Dlatego te detale – oprócz strony wizualnej – posiadać też będą funkcję informacyjną.

Malowaniem detali zajmę się na samym końcu, jak już wstępne grafiki warstw wszystkich poziomów będą gotowe. A te wstępne grafiki, na których platformy zgodne są z hitboksami, generowane są za pomocą specjalnego generatora, którego źródła znajdują się w załączniku deep platformer – mirror.zip, dodanym do poprzedniego posta. Źródła pozostałych generatorów też się w nim znajdują.

0
several napisał(a):
furious programming napisał(a):
several napisał(a):

Podoba mi się nieoczywista mechanika skakania, im dłużej przytrzymana spacja tym wyżej postać skacze. Szybkie "pacnięcie" o spację powoduje mały podskok.

IMO to jest obowiązkowa funkcjonalność, nie ficzer. Każda platformówka, nawet tak prymitywna jak Mario na NES-a, posiadała regulowaną wysokość skoku.

No widzisz, masz rację. Ja z platformówek tłukłem "Jazz Jackrabbit" gdzie obowiązywał double jump. Wstyd się przyznać, ale nie byłem specjalnie świadom tej mechaniki z przytrzymaniem klawisza skoku. W platformery, które grałem zawsze był double jump.

Jedno nie wyklucza drugiego. Może być przytrzymywanie klawisza + double jump.
Nawet w Jazz przytrzymywanie jest bardziej widoczne niż double jump. Bo "double jump" dla Jazza powoduje szybowanie na uszach, a dopiero dla Spaza jest to double jump. Przytrzymywanie pierwszego wciśnięcia klawisza szkoku wydłuża wysokość skoku dwukrotnie - dla obu postaci.

1

W końcu udało się przeskoczyć, ale nawet z podpowiedziami chyba za 16 razem dopiero...

1

Podwójnego skoku nie zamierzałem implementować – nawet się nad tym nie zastanawiałem. W całości skupiłem się na regulowanym skoku, wzorując się na grze Chip 'n Dale: Rescue Rangers, przeznaczonego dla Famicoma. Taki sposób sterowania bohaterem nie jest realistyczny, ale za to bardzo wygodny i łatwy do opanowania.


Zamiast rozbudowanej/skomplikowanej mechaniki bohatera, bardziej wolałbym wbudowany, wizualny edytor poziomów, coś jak np. w Lode Runner. Klawisze obecnie używane można by wykorzystać do obsługi edytora (łącznie z klawiszami debugowania), ale musiałbym nieznacznie przerobić silnik, tak aby móc uzupełniać kafle na niewidocznych na ekranie obszarach warstw (na tzw. marginesach).

Bez problemu dałbym radę zrobić taki edytor, jednak trzeba by poświęcić na niego dużo czasu, a tego jak zwykle brakuje. :/


vpiotr napisał(a):

W końcu udało się przeskoczyć, ale nawet z podpowiedziami chyba za 16 razem dopiero...

Poziom ten jest skonstruowany w taki sposób, aby po udanym skoku można było wrócić górą na początek planszy i próbować dalej – ukryte przejście do tego służy. Dzięki temu gracz może szlifować skok tak długo, jak tylko chce. ;)

0

Mógłbyś dodać większe ikonki do builda ;)

screenshot-20181124163858.png

0

Regulowany skok może być ciekawszy od podwójnego - jeśli się go oczywiście opanuje.

2

@Spine: ikony gry i wszystkich generatorów posiadają grafiki o rozmiarach 16x16, 32x32, 48x48, 64x64 i 128x128. Dorzucę jeszcze 256x256 – te powinny być użyte w widoku eksploratora, jaki pokazałeś.

0

Przydałaby się opcja nagrywania rozgrywki, bo programy do nagrywania prezentacji wymiękają przy tej grze. Mogę dodać taką funkcjonalność na zasadzie pluginu w postaci biblioteki .dll. W niej znajdowałyby się trzy funkcje:

  • inicjująca nagrywanie – do pobrania danych dotyczących nagrania, np. rozmiaru klatki i efpeesów,
  • przechwytująca klatkę – do pobierania bieżącej klatki gry i jej kodowania,
  • finalizująca nagrywanie – do zapisu końcowych danych i zamknięcia pliku z nagraniem.

Pierwszą funkcję gra wywoła raz po wciśnięciu klawisza nagrywania, drugą wywoływać będzie sukcesywnie w co drugiej klatce gry (lub w każdej), a trzecią po wciśnięciu klawisza zatrzymania nagrywania. W ten sposób do kodu gry wystarczy dodać małą klasę z prostą logiką, co zajmie dosłownie pół godziny, a biblioteka będzie mogła posiadać dowolną implementację tych metod.


O ile klasę obsługującą bibliotekę mogę bez problemu napisać w kilka chwil, to biblioteki służącej do nagrywania filmu już nie za bardzo – nie mam zielonego pojęcia na temat multimediów i musiałbym sporo czasu poświęcić na samą naukę i praktykę. Poza tym jeszcze dużo pracy mam w związku z zawartością gry (poziomy, outra itd.), więc czasowo nie dam rady wszystkiego sam ogarnąć. Tym bardziej, że deadline upłynął dawno temu.

Tak więc jeśli ktoś zna się na programowaniu multimediów i potrafiłby napisać funkcje odpowiedzialne za nagrywanie rozgrywki i tworzenie pliku wyjściowego, to z chęcią przygotuję kod gry do takiej funkcjonalności. A jeżeli nie będzie chętnych to cóż… zostanie tak jak jest. ;)

2

No dobra, kwestię nagrywania pozostawimy na razie w spokoju – może kiedy indziej.

Ważniejsza informacja jest taka, że poprawiłem kod obsługi skoku, tak aby dało się odbić z samego kraju platformy, na co narzekał m.in. @several. Zmian nie było dużo – wystarczyło zapamiętać stan bohatera sprzed obsługi ruchu w osi X, i ten stan wykorzystać w metodzie aktualizującej pozycję na osi Y.

Pierwsza modyfikacja to dodanie pola przechowującego początkowy stan:

// stary kod:

type
  THeroMovement = class(TObject)
  private
    function OnBound(AHero: THero; ALayer: TLayer): Boolean;

// nowy kod:

type
  THeroMovement = class(TObject)
  private
    FOnGround: Boolean;
  private
    function OnBound(AHero: THero; ALayer: TLayer): Boolean;

Druga modyfikacja do zapamiętanie czy bohater stał na platformie przed aktualizacją osi X:

// stary kod:

procedure THeroMovement.MoveHorizontally(AHero: THero; ALayer: TLayer; AMoveLeft, AMoveRight: Boolean);
begin
  if AMoveLeft or AMoveRight then

// nowy kod:

procedure THeroMovement.MoveHorizontally(AHero: THero; ALayer: TLayer; AMoveLeft, AMoveRight: Boolean);
begin
  FOnGround := OnGround(AHero, ALayer);

  if AMoveLeft or AMoveRight then

Trzecia poprawka to zmiana argumentów warunku podczas aktualizacji pozycji na osi Y:

// stary kod:

procedure THeroMovement.MoveVertically(AHero: THero; ALayer: TLayer; AGravity: Integer; AJump, AFreshJump: Boolean);
begin
  {..}

  if OnGround(AHero, ALayer) and AFreshJump then

// nowy kod:

procedure THeroMovement.MoveVertically(AHero: THero; ALayer: TLayer; AGravity: Integer; AJump, AFreshJump: Boolean);
begin
  {..}

  if FOnGround and AFreshJump then

I to wszystko co trzeba było zrobić.


Ta poprawka pozwoliła wyeliminować problem z odbijaniem się z krawędzi platformy, ale również odblokowała możliwość skoku z krawędzi przejścia wąskiego na jeden kafel. Czyli będąc w ruchu np. w lewą stronę, możliwe jest podskoczenie w sytuacji jak na poniższym zrzucie:

jump.png

Być może wykorzystam ten fakt do stworzenia trudniejszego skoku w którymś poziomie, ale co najwyżej po to, aby dostać się do świetlików, nie jako skok konieczny do ukończenia poziomu. Wszystko dlatego, że wymaga on maksymalnej precyzji – na to będzie raptem jedna klatka, a więc 1/60 sekundy.

Co prawda speedrunnerzy nie mieliby z tym problemu, bo dla nich Frame Perfect Jump to nic nadzwyczajnego, ale przeciętny gracz (w tym ja) musiałby trochę poćwiczyć. ;)

4

Wczoraj podczas dalszego usupełniania zawartości gry natrafiłem na kilka problemów – na jeden paskudny bug i na jedno ograniczenie. Przy okazji dodałem też jedną rzecz, która ułatwia debugowanie gry i jedną dla graczy.


Pierwszy bug objawił mi się podczas testowania animacji cutscenek. Pomimo prawidłowego wypozycjonowania elementu na ekranie, był on renderowany w nieprawidłowym miejscu. Zamiast być wyrównany do konkretnego punktu, był wyświetlany na środku obszaru. Na szczęście winnym okazał się kod gry, a nie generatora, więc łatwo było namierzyć problem i go zlikwidować. To pozwoliło po pierwsze załatać błąd, a po drugie skrócić kod, w tym usunąć niepotrzebne typy danych. Poprawek nie było dużo.

Druga sprawa to ograniczenie polegające na odpalaniu cutscenek po śmierci gracza. Mechanizm ten bazuje na liczbie zgonów w danej planszy i wykorzystuje ją do określania nazwy pliku z filmikiem. Problem w tym, że gra wykorzystywała jeden, globalny licznik, który dotyczył całej gry, a nie bieżącego poziomu. To uniemożliwiało odgrywanie cutscenek w późniejszych poziomach, jeśli w tych wcześniejszych nazbierało się zgonów. Dlatego też trzeba było zmodyfikować klasy liczników, dodając obsługę licznika lokalnego dla planszy. Wcześniej na to nie wpadłem, bo w pierwszym świecie (czyli w tutorialu) liczniki resetowane były po przejściu każdej planszy.

Teraz gra prowadzi dwa zestawy liczników (lokalne dla bieżącego poziomu i globalne dla całej rozgrywki), dzięki czemu problem wyszukiwania plików cutscenek został zażegnany. W podstawowym trybie, wyświetlana jest liczba zgonów (globalna dla gry) oraz lokalna liczba świetlików (zebranych i wszystkich na planszy). Natomiast w trybie debugowania, wyświetlane są dodatkowe informacje, czyli liczba zgonów w danej planszy (potrzebna do określania cutscenek oraz możliwa do manipulacji specjalnymi klawiszami) oraz globalny licznik świetlików.

Zrzut niżej ilustruje różnicę pomiędzy trybem podstawowym a wbudowanym cheat mode:

counters.png

Liczniki renderowane białym fontem to te podstawowe, a te szarym fontem to dodatkowe. Jak widać, w trybie debugowania nie ma już etykiety cheat mode w prawym górnym rogu – usunąłem ją, bo tekst liczników w rozszerzonym formacie potrafił nachodzić na tę etykietę, co brzydko wyglądało. Inna sprawa to fakt, iż teraz odstęp pomiędzy liczbą zgonów a świetlikiem jest zawsze stały i wynosi 12px – dodałem wyrównywanie do zawartości.

Ostatnia rzecz to nowy klawisz – F2 – który teraz pozwala zamrozić grę w dowolnej scenie. To sprawia, że wszelkie animacje ustają i można łatwiej robić zrzuty ekranu. Podczas zamrożenia w dalszym ciągu możliwe jest przesuwanie okna po ekranie oraz zmniejszanie i zwiększanie jego rozmiaru, dzięki czemu można sobie ustawić wymaganą do zrzutu rozdziałkę okna. Brakowało mi tej funkcji, a zainspirowałem się do jej dodania dzięki grze Midtown Madness, która przewiduje dokładnie taką samą funkcjonalność dla tego klawisza.

No, to tyle – można wracać do tworzenia poziomów. ;)


Edit: zapomniałem jeszcze wspomnieć o małym usprawnieniu. Świetlik po dotknięciu (złapaniu) przyjmuje stan Catched, a po wyfrunięciu poza ekran (a także po zmianie warstwy lub wyjściu z poziomu), otrzymuje stan Collected. Do tej pory, jeśli złapało się świetlika i zaraz potem wpadło w przepaść, zanim świetlik wyleciał poza ekran, to zostawał on zaliczony. Dodałem kilka linijek, które powodują niezaliczenie takiego złapania. Dzięki temu te znajdujące się w trudniejszych lokacjach trzeba złapać w taki sposób, aby przeżyć, co lekko utrudnia rozgrywkę i uważam to za zaletę.

1

Powoli sobie działam w związku z tworzeniem zawartości platformera. Nie idzie mi tak dobrze, jakbym tego chciał, bo chyba brakuje mi talentu do projektowania poziomów… ;)

Wszystkie poziomy w samouczku (w pierwszym świecie) stworzyłem w taki sposób, że sprawiają wrażenie przebywania w dziurze – obudowane praktycznie ze wszystkich stron (łącznie z murkami nad bohaterem). Takie mi się podobają – wyglądają dobrze i według mnie pasują do tej gry. Jednym ze światów będzie jaskinia, ponura i z dużą liczbą ciasnych korytarzy, co będzie stylem pasować do całości. Mimo wszystko jeśli wszystkie światy będą posiadały poziomy obudowane platformami ze wszystkich stron, to mogą być dość monotonne.

Jest jeszcze druga opcja – zrobienie poziomów otwartych, bardziej przestronnych – coś jak w Super Mario, w większej części bez platform nad głową. Przygotowałem jedną dla testów i absolutnie nie jestem z niej zadowolony. Nie dość że za dużo jest wolnej przestrzeni, to jeszcze znacznie trudniej przygotować dobrze wyglądające warstwy tła. Zastanawiam się też nad tym, czy dla każdego świata przygotować kilka dużych poziomów, czy może więcej mniejszych, ale z większą liczbą warstw.

Co myślicie? Która opcja brzmi ciekawiej?

0

Pokaż wersję testową (w stylu Mario) bo póki co jedynie Ty wiesz, jak ona wygląda, więc jak my mamy się do tego odnieść? :p

1

W załączniku jest spakowany plik poziomu. Plik należy wypakować i wrzucić do katalogu:

levels\chapter 1\world 0\

zastępując plik 0.level. Ten poziom będzie pierwszym po przejściu tutoriala.

1 użytkowników online, w tym zalogowanych: 0, gości: 1