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