Piszemy RPGo-Platformówkę (5) – Walka

Wprowadzenie uzbrojenia

W dzisiejszym (nieco opóźnionym) wpisie (a raczej uzupełnieniu poprzedniego) zajmiemy się omówieniem pierwszym rodzajem wyposażenia, nieodzownie połączonym z walką, a więc bronią.

Tradycyjnie dla tej serii, omawiany kod dotyczy zmian do commit’a [2f1f893], a wersja demo jest już dostępna do [pobrania].

Walka (część 2)


Pierwszym elementem od jakiego zaczniemy jest wprowadzenie „pojęcia” śmierci do naszej gry, tzn chcemy aby każdy obiekt posiadający statystyki po spełnieniu pewnych warunków był uznawany jako „martwy”, a więc niemogący wchodzić w interakcję z resztą otoczenia (nie może otrzymywać obrażeń, poruszać się).

W teorii sprawdzenie stanu postaci mogłoby się ograniczać do przyrównania ilości życia z zerem (do tego też się sprowadza podstawowa implementacja tej funkcjonalności), ale być może będziemy później chcieli wprowadzić specjalne postaci, które mimo braku życia będą mogły wchodzić w jeszcze jakieś interakcje.

Kolejnym wartym uwagi fragmentem kodu jest zauważenie, że dany obiekt nie zawsze w danej chwili zadaje obrażenia co zakładała nasza poprzednia implementacja. Bowiem może dojść do sytuacji, gdy zajdzie kolizja pomiędzy np. bronią a postacią, ale broń będzie w stanie cooldown’u, a więc nie będzie zadawała obrażeń.

Idąc dalej chcemy wprowadzić atakowanie nie przy użyciu „aury” postaci, a poprzez wyciągnięcie broni na wciśnięcie przycisku, w tym celu dodajemy jego obsługę:

Aktywacja bronic odbywa się następująco:

Tutaj pojawił nam się nowy obiekt klasy Weapon, który w powyższym listingu „uruchamia” naszą broń po wciśnięciu przycisku atak. Warto zauważyć, że do momentu gdy broń nie zostanie użyta to nie jest w stanie zadać obrażeń.

Tym samym zbliżyliśmy się do klasy Weapon, powyższa klasa umożliwia na stworzenie broni zarówno białej jak i palnej, mechanika aktywacji / dezaktywacji samej broni jest zaszyta także w samych Animacjach, które odpowiednio wyłączają i włączają kolizje z bronią.

Jak widzimy (zgodnie z moimi zapowiedziami) broń jest rozszerzeniem klasy CharacterStats, wprowadza ideę cooldownu oraz ilości dostępnej amunicji (po skończeniu której staje się bezużyteczna). Obie idee są proste i nie odbiegają zbytnio od poprzednich lekcji, a zatem pozwolę pominąć sobie ich dokładne objaśnienie.

Podsumowanie


To tyle co dla Was przygotowałem w tym wpisie, który jest de facto uzupełnieniem poprzedniego. W kolejnym pojawi się znacznie więcej ciekawych (i nowych) rzeczy, bo zabawimy się w stworzenie prostego AI.

Tradycyjnie zapraszam do zagrania w demo, dzielenia się komentarzami oraz śledzeniem bloga na social media (fb, twitter, g+).

Code ON!


  • Hej, zastanawia mnie używanie przez Ciebie notacji węgierskiej? Czy w dobie wszechobecnej IntelliSense, autocomplete itp. uważasz jej stosowanie za zasadne? W jakich przypadkach jest ono lepsze?

    • Możesz podać jakiś przykład? Jakoś niespecjalnie jestem w stanie ją zauważyć na listingach powyżej.

      • https://pl.wikipedia.org/wiki/Notacja_węgierska
        Chodzi mi o przedrostek m_, który dajesz przed nazwami pól w klasie np. m_ammunition, m_isCooldown. Ten przedrostek stosowano jako dodatkową informację o typie zmiennej. Ale od kiedy używasz Visual Studio, czy nawet Mono Develop typ zmiennej masz podpowiadany przy autocomplete’cie. Zastanawia mnie więc sensowność używania tej notacji w takich środowiskach. Konwencją w C# jest raczej PascalCase i CamelCase.

        • Ahh, tutaj to własna wygoda. Jakoś średnio mi się widzi wymyślanie nazwy dla pola publicznego, które wskazuje na swój prywatny odpowiednik.

          Inna sprawa to to, że dość często zdarza mi się korzystać z Vima (z różnych powodów), więc mam dodatkową warstwę informacyjną ;)