Piszemy RPGo-Platformówkę (11) – [Masz] i Moją tarczę!

Druga część wprowadzająca ekwipunek do gry

(…) i nie ostatnia!

W tym wpisie zajmiemy się dodaniem klasy przedmiotów pośrednich, które niby są przedmiotami, ale z drugiej nimi nie są (o tym dokładniej za chwilę). Zanim przejdziemy dalej to jeszcze zanim pojawi się w Waszych głowach myśl „Ile można ciągnąć temat ekwipunku?”, to usprawiedliwię się: logika „przedmiotów pośrednich” jest zaimplementowana, kolejna część zaprezentuje obsługę przedmiotów z poziomu UI (pozostanie nam do roboty czyste UI).

Tradycyjnie zapraszam do wcześniejszego zapoznania się z omawianymi zmianami: [diff], oraz do zagrania w najnowsze [demo].

Teoria


Wyjątkowo część teoretyczna będzie krótka.

Potrzebujemy specjalnego przedmiotu (uwaga: masło maślane), który będzie reprezentantem Przedmiotów (obiektów dziedziczących po Item) na scenie gry. Jak zapewne pamiętacie, to implementacja z poprzedniej wersji zajmowała się jedynie reprezentacją przedmiotu w menu ekwipunku (musimy zająć się tym brakiem).

(…) i Moją tarczę!


Sam wrapper (pojemnik jeżeli wolicie po polsku) na klasę Item jest mega prosty:

Nie robi praktycznie nic, służy jedynie do graficznej reprezentacji przedmiotów, które leżą luzem (ważne!) i np. są do zebrania, w przypadku eventów przekazuje je do obiektu-rodzica (obiektu, który reprezentuje), gdzie dane zdarzenie może zostać obsłużone.

Oprócz tego potrafi pojawić się na scenie (sytuacja gdy możemy go zebrać) lub zniknąć (gdy zostanie zebrany), służy do tego metoda SetVisibleOnScene włączająca/wyłączająca renderer oraz collider.

Przed zebraniem przemiotu

Nie obyło się też bez dodatkowych modyfikacji w innych źródłach:

PlayableCharacter zaczęliśmy obsługiwać zdarzenie kolizji i w momencie gdy następuje ona z ItemObject domyślnie zbieramy ten przedmiot:

A więc powodujemy, że obiekt zniknie (ważna uwaga: wywołujemy metodę z klasy Item, a nie Item Object!) oraz dodajemy go do ekwipunku gracza.

Największa ilość zmian przypadła wewnątrz klasy Item, pierwszą zmianą jest oczywiście dodanie parametrów umożliwiających odwoływanie się do reprezentanta obiektu oraz umożliwiwających jego stworzenie:

Mamy też metodę, której wywołanie widzieliśmy powyżej:

Jak widzimy na powyższym listingu – jest to wrapper, jednakże z całkiem dużym prawdopodobieństwem będziemy musieli w nim dodać dodatkową funkcjonalność, która będzie działa się w kontekście klasy Item (zniknie nam pusty wrapper).

Oprócz tego doszło nam stworzenie reprezentanta klasy Item przy tworzeniu obiektu, czyli jedyne co musimy dostarczyć to prefab i pozycję reprezentanta do klasy Item, nie musimy sami tej instancji tworzyć. Co ważne, to sam reprezentant może rozpocząć swój żywot w dwóch stanach: na scenie lub wewnątrz np. ekwipunku.

Po zebraniu przedmiotu

Bonus

Jako bonus chciałbym dodać kawałek kodu, który odpowiada za logikę ekwipowania przedmiotów, sam listing będzie omówiony szerzej w następnej części.

Widzimy na nim, że pojawiła się nowa właściwość obiektu, która mówi czy dany przedmiot został wyekwipowany (EQUIPPED), ogólnie kod odpowiada za poprawną logikę nakładania / ściągania przez postać wyposażenia (a więc zapewnia, że założony przedmiot nie będzie założony 2 raz i w drugą stronę: nie można ściągnąć 2 razy tego samego wyposażenia).

Bug fixy

Zazwyczaj tego nie robię, ale tym razem chciałbym zauważyć, że względem ostatniej wersji mamy kilka dość istotnych fixów. Błędy (wynikające z nieuwagi) pozostawione w tej samej formie mogłyby powodować crashe (a wiem, że niektórzy równolegle do tego kursu robią własne gry, stąd ta notka).

Najbardziej wymowny jest diff, więc pozostawię je bez żadnych dodatkowych komentarzy:

  1. [bugfix: value collision]
  2. [bugfix: out of memory]

Podsumowanie


Dzisiaj zaimplementowaliśmy „fizyczną reprezentację” na przedmioty w naszej grze.

W kolejnej części (i miejmy nadzieję, że ostatniej dotyczącej ekwipunku) zajmiemy się funkcjami kontekstowymi przedmiotów (czyli tym co widać na screenie powyżej).

Tradycyjnie zachęcam do komentowania, dzieleniem się linkiem (do bloga, wpisu) ze znajomymi, pobrania dema i śledzenia tej (i innych serii) na blogu.

Code ON!