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!


  • s.

    Czekam na dalsze części!

    • Kolejne części zaliczyły opóźnienie spowodowane studiami, liczę że przez majówkę uda mi się wyrobić, ale nic nie obiecuję

  • s.

    Zagrałam w demo. Jeśli dotykanie przeciwnika miałoby powodować utratę HP to proponowałabym ponawianie utraty HP po jakimś krótkim czasie, jeśli od przeciwnika nie odejdziemy. Czy jeśli klinęłam „Subskrybuj” na dole strony, to czy będę dostawać powiadomienia o nowych wpisach, czy tylko nowych komentarzach? Pozdrawiam :)