Deep Platformer – technologiczne demo prostej platformówki

Odpowiedz Nowy wątek
2018-09-18 22:33
9

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. ;)


edytowany 21x, ostatnio: furious programming, 2019-01-28 21:48
Wiem wiem, dlatego o tym wspomniałem. W razie braku zaufania, zawsze można odpalić w antywirusowym sandboksie. ;) - furious programming 2018-09-18 22:56

Pozostało 580 znaków

2019-04-15 20:27
0

Lazarus 1.8.4. na Linux Mint 19.1 - kompilacja oraz uruchomienie poszło od razu, zero problemów.
Jedyne co mnie zastanawia, to efekt, który widziałem na ekranie. Piszesz o demo gry, ale tak naprawdę nie była to gra, a jedynie napisy końcowe. Pojawiają się gratulacje z powodu przejścia wszystkich poziomów oraz creditsy. Tak miało być?


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2019-04-15 20:28

Pozostało 580 znaków

2019-04-15 20:29
0

A jak wydajność i jakie parametry sprzętu? Jak możesz to odpal grę z takimi parametrami:

> platformer cheatmode on

i napisz coś więcej. Głównie chodzi o licznik load podczas gry na dowolnym poziomie. ;)

cerrato napisał(a):

Jedyne co mnie zastanawia, to efekt, który widziałem na ekranie. Piszesz o demo gry, ale tak naprawdę nie była to gra, a jedynie napisy końcowe. Pojawiają się gratulacje z powodu przejścia wszystkich poziomów oraz creditsy. Tak miało być?

I tak i nie. :D

Zapomniałem usunąć parametry uruchomieniowe (okno Run Parameters) z ustawień projektu, w których zostały przełączniki dotyczące pomijania wszystkich scen prócz ostatniej, tak aby można było przetestować ekran staffu.

Zaktualizowałem załącznik w poprzednim poście i dodałem źródła bez żadnych parametrów.


edytowany 2x, ostatnio: furious programming, 2019-04-16 15:27
Postaram się później, teraz nie mogę. A co do kompa - raczej tragedii nie ma, i5 4x3,2GHz, 8GB RAM - cerrato 2019-04-15 20:38
Spoko, nie spieszy się. ;) - furious programming 2019-04-15 20:38

Pozostało 580 znaków

2019-04-16 14:50
1
furious programming napisał(a):

Teoretycznie teraz można ten kod skompilować na innych systemach, takich jak Linuks, FreeBSD czy macOS […]

Tego macOS chwilowo odwołuję – najwyraźniej ten gսpi system nie ma clock_gettime, więc muszę skorzystać z nanosleep. Ale dla Uniksów też skorzystam z nanosleep – gra nie będzie zżerała całej mocy CPU. Pod Windows niestety nadal będzie, bo ten system nie posiada Sleepa o dużej rozdzielczości. :/


edytowany 2x, ostatnio: furious programming, 2019-04-16 14:58

Pozostało 580 znaków

2019-04-22 02:25
1

Ok, świeżutkie źródła gry w załączniku. ;)


Zmodyfikowałem kod zegara, dzięki czemu gra korzysta z systemowej funkcji nanosleep do oczekiwania na kolejną klatkę (oczywiście na Uniksach, bo na Windows nic się w tej materii nie zmieniło). Po drugie, dodałem jeszcze jedną klasę, która przygotowuje ścieżki plików tuż przed ich (ścieżek) użyciem. Dzięki temu wykorzystywane są tylko absolutne ścieżki, zawsze zawierające natywne dla systemu separatory katalogów. Ścieżki bezwzględne są wymagane tylko dla macOS, bo pozostałe systemy potrafią korzystać z relatywnych. No ale już niech wszędzie będzie tak samo.

Dzięki tym dwóm zmianom, źródła powinny się kompilować i działać prawidłowo na wielu platformach i systemach operacyjnych, m.in. na Windows (od XP wzwyż), Linuks, BSD, Solaris czy macOS.


Jeśli ktoś chce to może przetestować – skompilować i uruchomić.

Feedback by się przydał, jeśli chodzi o systemy Uniksowe (na Windows śmiga). Przed zmianą kodu zegara wszystko na nich działało prawidłowo, ale nie wiem jak z nowym zegarem, bo choć źródła ludzie pobierali, to nikt nie dał znać co i jak. No i na macOS demówka nie była w ogóle testowana, więc co do tego systemu nie mam pewności… :/


edytowany 7x, ostatnio: furious programming, 2019-04-22 02:29

Pozostało 580 znaków

2019-04-22 14:27
0

Mała aktualizacja – na macOS kompiluje się i działa, ale okno jest niewidoczne… :D


Pozostało 580 znaków

2019-05-01 23:36
1

Co do powyższego posta, to zrezygnowałem z portowania kodu na macOS – nie mam nerwów do tego systemu, a i widgetset jest w pewnych miejscach niekompletny, więc nie będę tracił czasu na szukanie innych rozwiązań i oczekiwanie na testy i feedback.


Jedną rzecz dodałem do kodu. Do tej pory bramki były niewidoczne, a po wejściu na nie wyświetlała się etytkieta z ich przeznaczeniem. Czyli normalnie nie było wiadomo gdzie one się znajdują – detale platform miały sugerować ich pozycję na planszy, a po wejściu na bramkę, etykieta miała informować o tym że stoi się w bramce i można jej użyć. Tyle że i tak trudno by było je znaleźć, więc trzeba było coś z tym zrobić.

Aby zawsze było wiadomo gdzie są bramki, zawsze wyświetlana jest animowana, skacząca strzałka. Jeśli bramka stoi na ”podłodze” to strzałka wyświetla się nad nią, jeśli jest na suficie to strzałka jest pod nią, a jeśli bramka jest w powietrzu to wyświetlane są dwie strzałki – jedna nad i jedna pod. Animacja jest prosta – byle się coś ruszało i przyciągało wzrok. Po wejściu w bramkę wyświetlana jest etykieta, tak jak wcześniej.

Deep Platformer — gate markers.png

Wyjątkiem są bramki zapisu pozycji – te są dostępne tylko jeśli orientacja bohatera jest zgodna z orientacją bramki. W przeciwnym razie bramki nie da się użyć, a strzałka nie jest wyświetlana w ogóle.

Oczywiście wszystkie bramki będą dodatkowo ozdobione detalami platform.


W załączniku dodaję krótkie nagranie przedstawiające nowy ficzer. :]


edytowany 4x, ostatnio: furious programming, 2019-05-01 23:41

Pozostało 580 znaków

2019-05-13 14:37
1

Aktualizacja. :]


Dodałem ostatnią brakującą część, czyli kod w klasie zegara, pozwalajacy oszczędzać moc procesora. Teraz na platformie Windows gra nie zżera już całej dostępnej mocy jednego rdzenia, dzięki poprawieniu obliczeń oraz oczywiście użyciu procedury Sleep. Ale aby móc precyzyjnie zamrażać działanie gry pomiędzy klatkami, pętla zjadająca też jest używana – tyle że znacznie rzadziej niż wcześniej, stąd oszczędność mocy.

Jednak wykorzystanie takiego sposobu tworzenia przerw między klatkami jest mniej dokładne i czasem powoduje wahania klatkażu, dlatego w kodzie zegara pozostawiłem kod pozwalający pominąć użycie procedury Sleep i – tak jak wcześniej – przerwy wykonywać wyłącznie zżerając całą dostępną moc. To w jaki sposób ma się zegar zachowywać można zdeterminować parametrami wejściowymi.

Wykorzystanie ”lekkiego” zegara, oszczędzającego procesor (wartość domyślna):

> platformer.exe clock light

Użycie precyzyjnego zegara, wykorzystującego pełną moc:

> platformer.exe clock precise

Drugim ficzerem jest przystosowanie zegara do luźnego wykonywania klatek w momencie, gdy gra jest zatrzymana (za pomocą klawisza F2 lub gdy okno gry jest nieaktywne albo zminimalizowane). W takim przypadku logika gry oraz renderowanie klatek nie są wykonywane – sprawdzany jest jedynie input oraz okno jest przemalowywane (używając bieżącej klatki). No i ten ficzer sprowadza się do użycia Sleep(100) w takiej sytuacji, co zmniejsza zużycie mocy procesora do poziomu kilku procent.


Jeśli chodzi o kod źródłowy to raczej już nic się nie zmieni, co najwyżej kosmetyka. Bieżące źródła dodaję do załączników i zabieram się konkretnie za tworzenie zawartości.


edytowany 3x, ostatnio: furious programming, 2019-05-13 15:02
Jądra? Zmień na "rdzenia" proszę :) - Spine 2019-05-13 14:41
Mnie tam jądra nie przeszkadzają. ;) - furious programming 2019-05-13 15:01
Mnie też, ale dziękuję za poprawkę :) - Spine 2019-05-13 15:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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