Piszemy RPGo-Platformówkę (4) – Przygotowanie do walki

Przygotowujemy podwaliny pod wprowadzenie walki do gry

Hej, dzisiaj zrobimy sobie wstępne wprowadzenie do systemu walki. Z racji, że sam system jest dość spory to zdecydowałem się go wprowadzić w dwóch częściach (kolejna część za tydzień). Omawiam idee wprowadzone w commicie [132c3ed] (zachęcam do przynajmniej pobieżnego przejrzenia diffa).

Odrobina teorii


Tradycyjnie chciałbym poddać się paru rozważaniom przed przejściem do właściwego kodu.

Wiele z gier ma system walki, nie da się ukryć że może ona przejawiać się na wiele sposobów: od najprostszego skakania po głowach przeciwnikach i unikania ich (Mario), po tworzenie łączonych kombinacji ataków dających lepszy efekt (Shadow of Mordor). Można ją zrealizować na wiele sposobów, ale jedno jest pewne: powinna być w miarę intuicyjna i sprawiać przyjemność grającemu.

Sama walka może odbywać się na wiele sposobów, np na specjalnym ekranie oddzielonym od reszty gry (SouthPark).

Ekean walki (South Park)

Jednakże w grach platformowych przyjęło się, że walka jest bezpośrednia, jest integralną częścią gry gdzie bez żadnych zmian ekranów (scen) gracz ma okazję zmierzyć się oko w oko z przeciwnikiem.

Walka w Salt and Sanctuary

Jak się okazuje przeciwnikiem wcale nie musi być „żywa” postać, równie dobrze może to być uzbrojona pułapka / przeszkadzajka, po której dotknięciu gracz traci przynajmniej część zdrowia.

Teraz zejdźmy błyskawicznie nieco niżej do gamedevu – czym charakteryzuje się (i skutkuje) walka? Na tym, że jeden z obiektów traci swoje punkty życia. A czym jest to powodowane? Zajściem kolizji pomiędzy dwoma obiektami uczestniczącymi w walce.

Powyższy fakt daje nam podwaliny pod napisanie systemu walki i właśnie tym zajmiemy się w tym wpisie.

Walka (część 1)


Jak już zdążyłem wspomnieć w walce bezpośrednio uczestniczą 2 „osoby”: atakujący i obrywający. Obaj muszą posiadać podstawowe statystyki potrzebne do walki, a więc punkty życia (hp) oraz punkty obrażeń (dmg).

Oprócz tego jedna ze stron może być nieśmiertelna, tj. niewrażliwa na zadawane obrażenia (np. pułapko-kolce).

W powyższej klasie pojawiło się pole „owner”, które jest stosowane dla zwykłych przeciwników i gracza (nie-pułapek), jak już zdążyłem wspomnieć nie zawsze zadawać / otrzymywać obrażenia musi gracz, a więc warto wyłączyć powiadamianie drugiego obiektu o otrzymywanych obrażeniach.

Powyższy listing pozwoli nam na rozważenie sytuacji w której unikniemy otrzymania tych samych obrażeń wielokrotnie, w tym celu tymczasowo wyłączamy ich otrzymywanie.

Samo otrzymywanie obrażeń skupia się na sprawdzeniu odpowiednich flag, zmniejszeniu punktów życia i poinformowaniu o zmianie „właściciela” postaci do której należą te cechy.

Powyższy kod zakłada też, że jeżeli obiekt nie posiada klasy CharacterStats to nie może uczestniczyć w walce. Warto też zauważyć, że nadaje się on zarówno na postacie, jak i ich uzbrojenie, np. nałożone na miecz mogą zadawać obrażenia tak aby postać ich nie otrzymywała. Warto też zauważyć, że świetnie nadają się na stworzenie zużywalności broni w sytuacji gdy ta jest używana (to tak wybiegając do gry RPG).

Następnie warto stworzyć przynajmniej prototyp metody, którą zmienimy sobie w kolejnej części:

Tutaj widzimy debugowe logi z informacją o otrzymaniu obrażeń lub śmierci. Z racji, że tylko śmierć gracza może spowodować koniec gry, to nie możemy stworzyć przejścia do końca gry w tym miejscu. Musimy to zrealizować bezpośrednio w klasie Player.

Powyższe kody to prototypy, które ulepszymy w następnej części, bo jak widać kodu będzie całkiem sporo (pojawi się także uzbrojenie).

Jako ciekawostkę na koniec dodam jeszcze klasę, którą w trakcie rozwoju gry będziemy ulepszać o nowe elementy. Na razie mamy specjalny efekt, który zmienia kolor gracza po trafieniu na z góry określony czas:

Podsumowanie


Dzisiaj zrealizowaliśmy wstęp do systemu walki, który jak widać będzie całkiem spory i (mam nadzieję) uniwersalny dla wielu obiektów.

To tyle na dzisiaj, liczę że wpis Wam się podobał. Tradycyjnie zapraszam do pobrania [dema] (wciąż bardzo ubogiego w funkcjonalność), a także do systemu komentarzy, dzielenia się wpisem i śledzeniu przez social-media (wszystkie linki w bocznym menu).

W kolejnej części dokończymy system walki, a więc dodamy efekty na utracenie wszystkich punktów życia, animacje walki i dodamy broń.

Code ON!