POCISKI, STRZELANIE… W WARSTWIE- IZOMETRIA W ŚWIECIE PROSTOKĄTNYM- CZEŚĆ 5

Trochę wolnego czasu i jest kolejna część;) tym razem o strzelaniu lub inaczej mówiąc o naturze pocisku. Oczywiście kod programu jak i cały przykład wymaga Delphi i komponentu Omegi. Treść artykułu oraz sam pomysł jest uniwersalny, co nie oznacza, że jest tym jedynym i najlepszym podejściem do problem. Kod programu zawiera unit o nazwie „UnitPociski”. Jest tam zdefiniowana klasa o nazwie tPocisk, która determinuje cechy, właściwości pocisku. Przykład zawiera pocisk- włócznia, którą rzuca człowiek pierwotny- bohater tego świata 2D.
Poniżej atak na maczugę

Przypomnę „klawiszologię” obowiązująca w dołączonym przykładzie:
– klawisze sterujące- „strzałki” to ruch bohatera; strzałka w lewo/ prawo- obrót w lewo/ prawo; strzałka w „górę”/ w „dół” idź na przód / do tyłu
– Shift + strzałka w „górę” – bieg
– przytrzymany klawisz „m”- animacja mowy
– przytrzymany klawisz ”o”- animacja „och”, czy czegoś tam;)
– klawisz ”a”- rzut włócznią
– „Esc” koniec

Natura pocisku to:
1. moment strzału
2. lot
3. trafienie
4. brak trafienia- zasięg

Ad 1.Moment strzału
W tym punkcie musimy odpowiedzieć na pytanie/ kilka pytań
-czy obiekt strzelający w momencie strzału wykonuje animację czy nie?
-czy strzelamy ogniem ciągłym czy pojedynczym?
-czy obiekt strzelający ma niekończący się zapas amunicji?
-kilka innych pytań, które nasuwają się Tobie czytelniku;)

Ja odpowiem na pierwsze dwa podpunkty, reszta to „matematyczne” cechy obiektu strzelającego.

-czy obiekt strzelający w momencie strzału wykonuje animację czy nie?

Decydujemy się, że tak. Animacja to kolejne klatki rzucania wybierane odpowiednio do kierunku rzutu.

Tu należy przestrzegać zasady, że raz przyjęta kolejność kierunków stron świata obowiązuje dla wszystkich obiektów i ich klatek rysunków. Ja przyjąłem taką: N, NE, E, SE, S, SW,W, NW
Co w kodzie programu definiuje typ

W poprzednich częściach opisałem sposób animacji postaci bohatera. Teraz należy na tym samym modelu postępowania dopisać animację rzucania. Pojawią się nowe indeksy klatek

oraz procedura związana z rzutem procedure AtakDzida; którą gracz może wywołać wciśnięciem klawisza „a”. Aby mu to umożliwić trzeba to oprogramować, czyli dopisać kolejne zachowania naszego bohatera

Pasuje opisać, co się dzieje w procedure AtakDzida;

Jej działanie jest proste i ma na celu przełączanie klatek postaci rzucania gdy tylko zostanie przekroczona ta wartość

gdzie deltaSeconds to przekazana wartość z zegara gry. Gdy postać wykona pełny cykl klatek rzutu w danym kierunku to można podjąć akcję wyrzucenia pocisku, która równoznaczna jest z utworzeniem jego „duszka”. Od tego momentu pocisk zaczyna żyć i zachowuje się tak jak go opisaliśmy w procedurach jego klasy.
Ten warunek

decyduje o prędkości “strzelania”- wyrzucania pocisków. Jego brak równoznaczny jest z ogniem ciągłym;)

Ad 2. lot

W tym punkcie to można różne zachowania przypisać lecącemu obiektowi. Ale kilka elementów jest wspólnych dla różnych typów pocisków. Czy to jest dzida, kamień, kula, promień lasera zawsze musimy określić kierunek strzału, wybrać klatki animacji lotu, wykryć trafienie, uśmiercić cel, uśmiercić pocisk itp.

– kierunek lotu

Poniżej możliwe kierunki ruchu obiektów wraz z miarami kata wyrażonymi w stopniach i części dziesiętnej stopnia. 

Można zadać pytanie: Dlaczego dla kierunku SE kąt wynosi 36.86stopnia?
Wartość ta wynika z rozmiaru kostki świata tu wynosi ona 48×36 pikseli czyli tangens kąta kierunku SE to stosunek 36/48 licząc arctg otrzymamy 36.86. Poniżej tabelka z Excela

Pasuje te wartości zapisać w kodzie programu w postaci stałej tablicy. Ale w takiej kolejności jak przyjęliśmy kierunki świata : N, NE, E, SE, S, SW,W, NW

Dlaczego pamiętam stopnie, radiany oraz wartość funkcji sinus i cosinus? W tej chwili nie odpowiem na to pytanie – bo sam nie wiem;) Może do czegoś się przydadzą. Wystarczy pamiętać sinus i cosinus. Są one wykorzystane w równaniu ruchu pocisku.

Gdzie CosAlfa i SinAlfa to zmienne, którym przypisano wartości funkcji sinus w momencie tworzenia pocisku. Do tych zależności jeszcze wrócę w dalszej części artykułu.
I tu uwag lepiej jest pamiętać raz obliczone wartości sinusów i cosinusów niż je wielokrotnie obliczać w zegarze gry. Szybciej jest pobrać coś z pamięci niż policzyć, a zwłaszcza wartości funkcji trygonometrycznych, a w grze może się zdarzyć, że w danym momencie będzie „latać” kilkadziesiąt pocisków.
Wiemy już, jakie mamy kierunki lotu. Teraz należy ustalić- przypisać ten kierunek do pocisku. Jak to zrobić? Bardzo prosto. O kierunku decyduje kierunek ustawienia strzelającego obiektu – tu postać pierwotniaka. Przypuśćmy, że postać- duszek stoi patrząc w kierunku SW Stosując prosty pomysł wynikający z przyjętego ujednolicenia kolejności kierunków świata dla klatek ruchu, katów itp. przechowywanych w tablicach wystarczy podać go do procedury tworzenia pocisku i odczytać indeks kierunku

Dal przypomnienia funkcja Ord()[/] zwraca indeks występowania elementu w zbiorze, czyli

ord(Kierunek) dla Kierunek:=k_SW; da nam ze zdefiniowanego zbioru typów możliwych kierunków

wartość 5. I teraz wszystko odczytujemy z naszych tablic spod indeksu 5. Porządek w organizacji danych ułatwia życie, gdzieś w kodzie programu znajdziesz Czytelniku te linie

Wrócę na moment do równań ruchu:

Należy pamiętać, aby uwzględnić w nich przesunięcie świata wynikające z ruchu bohatera czy ogólnego przesuwania myszką. Lecący pocisk musi być odpowiednio przesuwany o wartości skoku świata w kierunku osi X i Y. Jeżeli przewidujemy pokazywanie przez jakiś czas obrazu pocisku po jego upadku to też o tym musimy pamiętać. Ale wtedy ich postać będzie prostsza:

Lecz pocisk musi zliczać głębię w izometrycznym świecie, tu zmienna z. Robię to na tych samych zasadach, co dla duszka postaci, tylko daję je wartość zwiększoną o osiem jednostek. Tak, aby mogła szybować nad drzewami czy dachami. Ale jeżeli już upadnie, to zmniejszam tą wartość, tak, aby postacie mogły sobie deptać po obrazie leżącej na trawie włóczni.

-symulacja lotu

Jest opisana w/w równaniami. I nie są to równania „balistycznej”. Symulację krzywej balistycznej uzyskałem z animacji klatek lecącej dzidy;) Owszem dla strzału z katapulty tak się nie da zrobić- szkoda pamięci na obraz. Pomysł tkwi w klatkach. Poniżej ich obraz

Tworząc tablicę animacji klatek lecącej dzidy dla kolejnych kierunków geograficznych. Powiedzmy o takiej postaci:

uzyskam symulację krzywej toru lotu pocisku wykonując to w tej procedurze

Przerzucanie klatek wykonuję na tych samych zasadach, co dla postaci pierwotniaka. Problem tkwi we właściwym doborze klatek ruchu. Ja miałem do dyspozycji gotową grafikę pobrana ze strony wspomnianej w pierwszej części tego cyklu, swoim programikiem- „automatem” posklejałem w kolejne klatki i na „oko” powybierałem. Jest jak jest.

Ad 3. i ad 4.- trafienie / brak trafienia, zasięg

Ten tematy można omówić jako całość. Ogólnie należy wykryć kolizję. W dołączonym przykładzie możemy niszczyć jednym trafieniem włóczni wirujące maczugi. Maczuga ginie, ginąc zwalnia zakazane pole ruchu drogi. Po jakimś czasie ginie pocisk. Jeżeli pocisk nie trafił, to musi skończyć lot i też zginąć po określonym czasie. Długość lotu, czyli zasięg określam bardzo prosto- dojściem do końcowej klatki animacji i wykonania procedury

Kolizja jest standardowa procedurą

Można ją przerobić tak aby reagowała na pozycję grota włóczni. Należy określić zakresy obszaru prostokąt położeni grota w kolejnych klatkach i sprawdzić czy w momencie kolizji te wartości procedury wykrywania kolizji

mieszczą się w tych obszarach, ale mnie się już tego nie chciało pisać.

I to by było na tyle
Pozdrawiam Adam Lasko(oksal) Zbylitowska Góra 3 maja 2008

PS

Pliki wymagane do tej części artykułu to:

swiat_512x384.mue2D
kasztan.oil
teren_rosliny.oil
swiatynie.oil
zamki.oil
pierwotny001.oil
wiatrak.oil
mlyn.oil
pociski.oil
D3DX81AB.DLL
MPPSDK.DLL 

Autor: oksal

Załączniki