Piszemy RPGo-Platformówkę (9) – Witaj wędrowcze!

Wstęp do części z pisania gry RPG

Hej, dzisiaj zastanowimy się (ogólnie) jak powinna wyglądać nasza gra, tym razem w kontekście gier RPG.

Słowem wyjaśnienia…

Krótka notka odnośnie tego, że pojawiła się część dotycząca gry RPG, a nie ostatnia dotycząca platformówki:

W ostatniej części chciałem dorzucić ładniejsze animacje, lepszą grafikę, dźwięki, … . Ostatecznie uznałem, że nie mają one większego znaczenia, a same systemy prawdopodobnie mocno by się jeszcze pozmieniały, więc nie ma co tracić na to czasu i lepiej zabrać się za grę RPG, a te rzeczy dodamy nam sam koniec gry ;)

RPG


Gry RPG są jednym z trudniejszych gatunków gier w gamedevie: wymagają sporo pracy na wielu płaszczyznach – muszą mieć wiele dobrze zaprojektowanych mechanik (np walki), ale też tych „fabularnych”.

Sama gra powinna dawać wrażenie ‚prawdziwego’, żyjącego świata, rządzącego się logicznymi prawami, które łączą się w wiele mechanik dającymi swobodę graczowi: np aby zdobyć miecz (ekwipunek):

  1. Możemy go kupić (handel), z kolei do tego potrzebujemy pieniędzy; te z kolei możemy zdobyć wykonując zadania (misje).
  2. Inną ścieżką do zdobycia miecza jest jego wykucie (crafting), tutaj z kolei wymagany jest pewien poziom umiejętności wykuwania broni (drzewko umiejętności).
  3. Oczywiście nic nie stoi na przeszkodzie aby go ukraść (system dobra i zła / morale).

Jak widzimy do tak prostej czynności możemy podejść na wiele sposobów, taka swoboda zapewnia graczowi sporo frajdy, ale nam – programistom – dodaje całkiem sporo systemów do napisania, po to tylko aby mógł zdobyć miecz w dowolny sposób ;)

Witaj wędrowcze!


Mam nadzieję, że powyższym przykładem chociaż trochę poruszyłem Twoją wyobraźnię, odnośnie tego jak skomplikowane mechaniki mogą kryć się za prostymi czynnościami. W ciągu kolejnych lekcji chciałbym się nimi zająć, ale tutaj ważna uwaga: nie wszystkie poruszymy dogłębnie – po prostu stworzymy jej uproszczoną wersję i przejdziemy dalej (powód? zamieniłoby się to pisanie w pełnoprawnej gry RPG, a pisanie pełnoprawnej gry RPG w pojedynkę nie jest za dobrym pomysłem).

Wszystkie systemy, które chciałbym omówić:

  • ekwipunek – plecak gracza,
  • handel – pieniądze, sklepy, handlarze,
  • zadania (misje),
  • umiejętności (rozwój postaci),
  • morale,
  • NPC – rozmowy, opcje dialogowe,
  • (opcjonalnie) crafting.

Jeżeli macie jeszcze jakieś pomysły to zapraszam Was do pisania ich poniżej, być może nimi także się zajmę.

Uwaga: Nie zdarzyło mi się jeszcze „popełnić” żadnej gry RPG, część z tych systemów już zdarzyło mi się pisać (np umiejętności), także należy mieć to na uwadze, że prezentowane przeze mnie rozwiązania są autorskie i nie muszę się w 100% pokrywać z tym jak to faktycznie wygląda w gamedev’ie.

Ta część „poradnika”, zamienia się we wspólną podróż gdzie razem odkrywamy „nowe lądy”, dlatego tym bardziej zachęcam do współpracy nad kodem, dzieleniem się pomysłami, spostrzeżeniami ;)

Poniżej przedstawiam ogólny pogląd na elementy do zaimplementowania:

Podsumowanie


To koniec na tą część, liczę że tematy które chciałbym poruszyć wydają się Wam ciekawe. Zachęcam do przestudiowania podrzuconego przeze mnie szkicu kodu i podzielenia się swoją opinią, własnymi propozycjami.

Tradycyjnie zapraszam do sekcji komentarzy, śledzenia bloga przez social-media (panel po prawej) i dzielenia się tym wpisem ze swoimi znajomymi.

W kolejnej części zabierzemy się za ekwipunek, do przeczytania w kolejnym wpisie!

Code ON!


  • Condzi

    Po co free_capacity w Equipment? Nie lepiej dodać metodę która zwraca masę wszystkich itemów? (int getItemMass() z pętlą jeżdżącą po wszystkich items i sumującą ich masę)

    • Maciej Gwiżdż

      Ja tak sobie pomyślałem, że maxCapacity to może być atrybut postaci, który może się zwiększać wraz z levelowaniem (tak jak np. w Tibii), a klasa equipment to tylko kontener na przedmioty, które postać ma założone na sobie, a osobna klasa backpack to kontener na przedmioty w plecaku. To czy możemy coś włożyć do plecaka, albo bezpośrednio z ziemi założyć na siebie sprawdzała by jakaś metoda.

      class Player {
      private:
      int maxCapacity;
      Equipment eq;
      Backpack backpack;
      bool canIGet();
      public:
      get() {if(canIGet)…;}
      }

      • Jest to także dobry koncept, szczególnie gdy pojemność plecaka gracza to umiejętność. Gdy robiłem ten szkic to o EQ myślałem jak o plecaku, który możesz rzucić na ziemię ;)

    • No właśnie tego jeżdżenia po wszystkich elementach w plecaku co wywołanie getItemMass() wolałbym uniknąć, nie lepiej jest wyliczyć tą wartość raz i jedynie aktualizować przy dodawaniu / usuwaniu przedmiotów?