Cześć wszystkim, z tej strony Crash. Dzisiaj chciałbym pokazać wam prosty, ale pozwalający na spore rozbudowanie, system ABS oparty na zdarzeniach. Głównym założeniem tego systemu jest stworzenie walki opartej o zręczność, a nie, jak to zwykle w Makerze bywa, uderzenie, gdy tylko gracz podejdzie do przeciwnika. Choć pomysł, który wpadł mi do głowy jakiś czas temu nie jest idealny, stara się on opierać o trzy główne zasady dobrego akcyjniaka:
- animacja startowa – ruch postaci, który ta wykonuje, gdy rozpoczyna swój atak;
- kontakt – moment, w który następuje uderzenie;
- animacja odnowienia – czas, gdy postać po ataku wraca do pozycji naturalnej.
W pierwszej kolejności stwórzmy jednak przeciwnika. Dla mnie będzie to event, który nazwałem „Blobuś” i sposób jego aktywacji ustawiłem na „Parallel”. Ruch natomiast określiłem jako losowy. W ten sposób nasz przeciwnik będzie szwendać się po okolicy.
Nie chcemy jednak, aby jego celem było chodzenie w bliżej nieokreślonym kierunku, prawda? Przeciwnik powinien starać się zaatakować gracza, gdy ten będzie w jego pobliżu. Do tego przyda nam się określenie pozycji Blobusia względem gracza. Zrobimy to za pomocą script calla znanego niektórym z tutorialu o bombach.
Math.abs($gamePlayer._x ‐ $gameMap._events[this._eventId]._x) <= 3
Math.abs($gamePlayer._y ‐ $gameMap._events[this._eventId]._y) <= 3
Taki zapis sam w sobie nie robi jeszcze nic, ale gdy wprowadzimy go do warunku, pozwala nam on określić, czy gracz znajduje się w odległości 3 kratek od eventu. Dlatego bardzo ważnym elementem było ustawienie zdarzenia na „Parallel”, gdyż dzięki temu nasz wróg na bieżąco będzie sobie sprawdzał, czy postać znajduje się w strefie zainteresowania.
Przy tak przygotowanym skrypcie potrzebujemy tylko akcji, która ma się wykonać. Ustawmy, więc „Self Switch:A = ON”. Aby ułatwić sobie życie kopiujemy stronę i wklejamy jej duplikat.
Na zduplikowanej stronie w pierwszej kolejności ustawiamy warunek odpalenia na „self switch: A”, a następnie usuwamy z naszego warunku „Self Switch:A = ON”. W tym wypadku zmieniamy również zasady ruchu. Dla mnie będzie to „approach”, a speed i frequency ustawiłem na 4. Zaznaczamy cały warunek klikając w pierwszą widoczną w zdarzeniu komendę i klikamy spację, aby otworzyło nam się okno edycji warunku. Stawiamy ptaszek obok „Create Else Branch” i klikamy OK. W nowo powstałej linijce wstawiamy „Self Switch:A = OFF”. To samo analogicznie robimy z drugim warunkiem. W ten sposób Blobuś wróci do szwendania się po mapie, gdy postać nie będzie już w zasięgu eventu.
W tak ustawionym evencie Blobuś będzie chodził w losowym kierunku po mapie, ale po wejściu w jego strefę zainteresowania, zacznie poruszać się w kierunku gracza. Gdy opuścimy teren 3×3 kratek nasz sympatyczny przeciwnik wróci do swoich codziennych obowiązków.
Co się wydarzy jednak, gdy podejdzie do gracza? Nic, ponieważ nadal nie wprowadziliśmy mu funkcji ataku. Aby to zrobić kopiujemy to, co do tej pory stworzyliśmy, i wklejamy w nasz główny warunek. Edytujemy jednak odległości i ustawiamy je na x<=1 i y<=1 oraz odznaczamy „else”.
W tym momencie przechodzimy do wcześniej wspomnianych zasad. Nie możemy po prostu wrzucić tutaj animacji ataku i odjąć zmiennej, gdyż przeczyłoby to dobremu systemowi walki. Dwie postacie, które stoją naprzeciwko siebie i czasami obok nich pojawi się jakaś animacja, to nie jest dobry ABS. Co zatem zrobimy? Ano ustalimy animację rozpoczynającą atak. Ma ona za zadanie zasygnalizować grającemu, że za chwilę może otrzymać obrażenia, ale jeżeli zdąży uciec przed jej końcem, to uda mu się uniknąć ciosu.
Z racji tego, iż przeciwnik podejść może do nas z każdej strony, ważnym jest, aby w pierwszej kolejności ustawić mu „Turn toward Player”. W ten sposób przeciwnik będzie atakował w kierunku gracza, a nie zadawał obrażenia stojąc do niego tyłem. Następnie dodałem 30 klatek przeczekania, animację skoku i kolejne 15 klatek przeczenia. Oczywiście wy możecie użyć innych, normalnych animacji. Ja na potrzeby tego tutorialu użyję tego, co jest standardowo w programie.
Po wykonaniu animacji ataku drugim punktem jest sprawdzenie, czy doszło do kontaktu. Zrobimy to ponownym sprawdzeniem, czy gracz nadal znajduje się w polu 1×1 od gracza. Wystarczy zatem skopiować wcześniejszy warunek i usunąć z niego animację startową. Dodajemy w nim jednak cios i utratę HP. W moim przypadku będzie to podstawowa animacja fizycznego ataku i podstawowe zredukowanie HP o 15 punktów. Można to zrobić oczywiście ustalając np. jedną ze zmiennych jako punkty życia. Wtedy po prostu ustawiamy, że zmienna HP zostaje zredukowana o jakąś liczbę.
Kolejnym, ostatnim krokiem, jest powrót do stanu naturalnego. Dla mnie będzie to prosty sygnał w postaci odwrócenia się od bohatera i poczekania 60 klatek.
Czas trwania każdej animacji oczywiście zależy od was. Może to być 20 klatek, 80 klatek. Wszystko zależy od tego, jak bardzo chcecie podkręcić prędkość systemu walki. Pamiętajcie jednak, że gra nadal powinna być fair dla gracza.
Co udało nam się do tej pory zrobić? Stworzyliśmy przeciwnika, który chodzi w losowy sposób po mapie do momentu, aż gracz wejdzie w jego strefę zainteresowania. Wtedy przechodzi do ofensywy i zaczyna podążać za bohaterem. Gdy dotrze do naszej postaci, próbuje wykonać atak, jednakże gracz ma nadal szansę takowy ominąć lub zablokować (o tym później). Po ataku, udanym bądź nie, przeciwnik przechodzi w fazę powrotu, podczas której jest podatny na ataki i daje szansę graczowi na kontratak, ale kontratakiem zajmiemy się już w następnej części tego tutoriala.
Crashykk