![]() Pobierz kod Izometria w świecie prostokątnym- część 5 |
|
POCISKI, STRZELANIE… W WARSTWIE- IZOMETRIA W ŚWIECIE PROSTOKĄTNYM- CZĘŚĆ 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 problemu. Program 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". Jego brak równoznaczny jest z ogniem ciągłym;) Ad 2. lot W tym punkcie 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 48x36 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 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 cześ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. 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. 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 gotowa grafikę pobrana ze strony wspomnianej w pierwszej części tego cyklu. Jakoś to 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 Te tematy można omówić jako całość. Ogólnie należy wykryć kolizję. W 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 reagowł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 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 |
