Jak ugryźć platformówki

Artsa tego pisze bo znalazłem chwile czasu i się nudzę, postaram się pokazać jak można zrobić prostą grę platformową, od razu zaznaczam, że skupie się na Enginie, a nie na rysowaniu tego na ekranie. Tak więc całość będzie rysowana na PaintBoxie, jak się komuś nie podoba zawsze może podłączyć to do innego silnika i będzie gut. To zaczynamy:

1. Założenia.
Ludzik chodzi ze stałą prędkością w lewo/prawo
Podskok ma być taki jak w rzeczywistości, (zwalnia lot przy wznoszeniu i przyśpiesza przy spadaniu)
przez platformy da się przeniknąć “od dołu” tzn. Ludzik nie uderza głową o platformę przy skakaniu.

2. Co nam potrzebne.
umiejętność programowania obiektowego
mózg
chwila czasu i cierpliwości
delphi

3. Zaczynamy.
Na początek warto się zastanowić jak będziemy trzymać dane o naszym levelu ? Ja wybrałem rozwiązane oparte o listę obiektów (każdy obiekt w tej liście będzie zawierał informacje o lokalizacji platform) inna droga to zrobienie tablicy o odpowiednich wymiarach i trzymanie w niej mapy na podstawie. Ok co musimy pamiętać w naszej platformie ? Otóż na początek kilka podstawowych rzeczy czyli:

współrzędne początku x,y
wysokość oraz szerokość platformy

W późniejszym czasie będzie można dodać np. prędkość poruszania się platformy (jeśli ma latać) albo czy platforma zabija naszego ludzika (np. kolce i inne chadziajstwa), ale to może kiedy indziej na razie pamiętamy gdzie ta platforma stoi).

Drugi ważny element naszej gry to ludzik 🙂 Tak więc musimy pamiętać o nim to co o platformie (gdzie jest i jaki duży jest) oraz kilka dodatkowych rzeczy:

czy spada/skacze ?
Jeśli spada lub skacze to jaka jest jego prędkość Y ?

I tak właściwie to mamy już wszystko 🙂 Teraz weźmy się za pisanie, zrobimy sobie 4 klasy:

TDimObj – w tej klasie będziemy trzymać informacje o wymiarach obiektów, klasa macierzysta dla pozostałych obiektów
TLudek – klasa dziedzicząca po TDimObj wszystko co jest nam potrzebne do ludzika
TPlatform – klasa, w której będziemy trzymać informacje o platformach
TLevel – klasa, w której będziemy trzymali listę platform oraz inne procki potrzebne nam do zarządzania levelem.

Nie będę kopiował tutaj deklaracji klas bo szkoda na to czasu i miejsca. Omówie co ciekawsze (wg mnie) kawałki kodu, resztę trzeba zrozumieć samemu, program jest napisany bardzo prymitywnie wiec nie sądzę aby były z tym jakieś problemy.

Jak to to działa ?
Jak klikniemy Button to:
stworzymy plansze
stworzymy ludzika
uruchomimy timer

W timerze znajduje się główna część odpowiedzialna za działanie wszystkiego w jednym tempie, tzn. Wykonujemy update Ludzika oraz jego pozycji, nakazujemy odrysowanie levelu. Jak zapewne widać ruch ludzika odbywa się na podstawie dwóch pól (fDoLeft, fDoRight) jeśli któreś z nich jest ustawione na true (dzieje się to w metodzie OnKeyDown) to ludek będzie dreptał w określonym kierunku, gdy jest false (patrz OnKeyUp) to nie będzie dreptał. Skok jest realizowany poprzez wywołanie metody Ludek.Jump co można znaleźć w OnKeyUp.

Tyle się właściwie dzieje na głównej formie naszego projektu, jak widać niewiele, engine jest w 90% niezależny od tej formy i właściwie równie dobrze może działać na konsoli (trzeba przerobić tylko metody Draw w odpowiednich klasach).

Backend.
Tutaj na razie też nie ma żadnej rewelacji pokrótce omówię kilka metod:

Sprawdzamy czy już nie lecimy/spadamy, jeśli nie to ustawiamy odpowiednią zmienną na true oraz ustalamy prędkość początkową, im wyższa prędkość tym wyżej skoczymy 🙂 Ale to już wszyscy wiemy z fizyki. Druga Metoda to TLudek.Fall bystre osoby zauważą że różni się ona od Jump’a tylko jedną sprawą, a mianowicie fYVel jest -1, ta mała kosmetyczna zmianka powoduje, że ludzik nie będzie się wznosił tylko od razu zacznie spadać, prawda że fajne ?

TLudek.Update główna metoda, która coś robi w miarę aktywnego w całym enginie, a mianowicie pozwala naszemu ludzikowi skakać i spadać, większość jest opisana w kodzie i raczej nie powinno być problemów wiec skupie się tylko nad tymi linijkami:

eż raczej nic odkrywczego wychodzimy ze wzoru na drogę w ruchu jednostajnie opóźnionym tj:
s(t) = Vo*t – 1/2*a*t*t. Aby uniknąć zabawy ze zliczaniem czasu lotu (bo i po co to komu) wzór ten należy pozbawić czasu, a najprościej to zrobić korzystając z wektorów o tak:

V=Vo

a później już tylko dodawanko i odejmowanko

s = s + V
V = V – Vs
Vs = a/t

czyli jeśli znamy a/t czyli o ile zwolni nasz obiekt co jedną jednostkę czasu to znika nam czas (hura 😉 ). Tak nawiasem Vs w programie nazywa się cGravity a Vo nazywa się cStartVel.
I jeszcze ważna sprawa, musimy wprowadzić mały ogranicznik dla V, jeśli dojdziemy już do spadania i V > grubość platformy (pomińmy niezgodność jednostek….) to okaże się, że nasz ludzik może (ale nie zawsze będzie, sami dojdźcie dlaczego) przelatywać przez platformy.
To tyle co stworzyłem, jeśli będę miał znowu trochę czasu to napisze jak zrobić drugiego ludzika którym będzie sterował komputer, pokaże jak zrobić aby AI potrafił znaleźć drogę z jednej platformy na inną i inne czarne rzeczy 🙂

Autor: Toster

Załączniki