Rób to krócej następnym razem. Rozszerzalność.


Duże i małe projekty

   Kiedy zacząłem tworzyć gry w RPG Makerze miałem w głowie zrobić grę dłuższą niż 20 godzin. W 2018 roku nie jestem nawet blisko tego celu, ale nauczyłem się co jest bardzo ważne zarówno w dużych projektach jak i w mniejszych. 
   Załóżmy, że tworzymy własny system skradania gry. Tworzymy pierwszego strażnika, który będzie potrafił nas złapać. Chcemy jednak, aby poziom trudności rósł, a co za tym idzie - szybkość poruszania się strażnika i zasięg jego widzenia. Długość wprowadzenia takiego trudniejszego strażnika zależy od rozszerzalności naszego systemu. Jeśli system jest dobrze rozszerzalny wystarczy skopiować wcześniejszego strażnika i zmienić mu dwie zmienne i po sprawie. Jednak, gdy brakuje tego czynnika tworzenie nowego wroga może zająć nam dużo więcej czasu. Ogromnym plusem implementowania rozszerzalności jest to, że gdy po jakimś czasie zapragniemy, aby strażnicy zaczęli nas gonić, gdy nas zobaczą, to nie trzeba będzie od nowa wszystkiego pisać tylko dodać tą funkcję do skryptu.

Zaczynamy

   Od czego powinniśmy zacząć chcąc stworzyć rozszerzalny system? Od planowania. Najlepiej wiedzieć najwięcej o tym co chcemy stworzyć. Inny przykład - tworzymy własny turowy system walk. Co powinno być tutaj rozszerzalne? Sam system, wrogowie, umiejętności, używanie przedmiotów, stany i jeszcze wiele innych.
   Wezmę za przykład użycie umiejętności na wrogu. Możemy to zrobić w ten sposób, że gdy użyjemy umiejętności "zatrucie", to zabierze ona 100 punktów życia i narzuci stan zatrucie. Potem tworzymy umiejętność "zatruta strzała", która również zatruwa, ale zabiera 200 punktów życia. Żeby stworzyć drugą umiejętność musimy od nowa stworzyć warunek, tylko na końcu zmienić HP_Wroga-=100 na HP_Wroga-=200. Będzie to bardzo żmudne przy dużej ilości umiejętności.
   By to zmienić musimy wszystko potraktować ogólnie. Nie powinno nam siedzieć w głowie, że tworzymy akurat umiejętność "zatrucie", tylko robimy bazę do systemu zadawania obrażeń i nadawania stanów. Przede wszystkim tworzymy zmienne praktycznie do wszystkiego co będzie się zmieniało przy innych umiejętnościach. U nas będzie to różnica w dmg umiejętności i ewentualnie inna zmiana stanu. Tworzymy zmienne: zadane_obrazenia i narzucony_stan. Przed wywołaniem funkcji lub w jej trakcie odczytujemy id umiejętności i na jego podstawie podkładamy odpowiednie wartości. Załóżmy, że id "zatrucia" to 1, a "zatrutej strzały" to 13. Jeśli id będzie równe 13, to ustawiamy zmienną zadane_obrażenia na 200, a narzucony stan na "zatrucie".

Inne systemy

   Podałem tylko jeden przykład. Jak zrobić to w wielu różnych systemach? Gdy tworzę własne systemy trzymam się tych kroków:

  1. Planowanie systemu
  2. Przygotowanie zmiennych, które będą się zmieniały w zależności od czynników (takich jak inna umiejętność)
  3. Stworzenie skryptu sterującego wszystkimi czynnikami zależnej od zmiennych
  4. Dać dostęp zdarzeniom do tego skryptu (w RM będzie to najczęściej typowe zdarzenie)
  5. Przetestowanie systemu na kilku różnych czynnikach (umiejętnościach)
  6. Stworzenie bazy zdarzeń obsługiwanych przez ten skrypt
  7. Implementowanie skryptu do gry
   Wróćmy do systemu skradania, aby zobrazować jak to wygląda w praktyce. 
  1. System na potrzeby bloga będzie prosty. Poszukujący nas będą różnili się tylko zasięgiem widzenia, ścieżką chodzenia i szybkością. 
  2. Przygotowujemy więc trzy zmienne: szybkosc_staznika, sciezka, zasieg_straznika. 
  3. Tworzymy skrypt czyli wykrywanie czy stoimy na tyle blisko strażnika (używamy zmiennej zasieg_straznika), aby ten nas zauważył i tworzymy drogę jego chodzenia po pomieszczeniu (zmienna szybkosc_straznika). 
  4. W przypadku skryptu w języku programistycznym wrzucamy wszystko w funkcję, do której każdy obiekt ma dostęp, a w RM wrzucamy skrypt do typowych zdarzeń i wywołujemy go na zdarzeniu z grafiką strażnika.
  5. Tworzymy kilku wrogów o różnych wartościach tych trzech zmiennych.
  6. Gdy wszystko działa poprawnie tworzymy bazę danych, która każdemu id przypisuje różne wartości tych 3 zmiennych. 
  7. Przenosimy skrypt z programu, na którym go tworzyliśmy do głównego projektu.
   Od siebie dodam, że niektórych rzeczy bym w RPG Makerze nie robił, bo są prostsze sposoby. Np. tutaj o wiele łatwiej ścieżkę chodzenia stworzyć w konkretnym zdarzeniu niż tworzyć zmienną przechowującą takie informacje.

   O rozszerzalności związanej z dodawaniem do skryptu nowych funkcji np. do systemu skradania dodać możliwość chowania się tak, aby strażnicy nie zaczynali nas gonić, gdy wejdziemy w ich zasięg porozmawiamy innym razem. Tym czasem... Ahoj!

Komentarze

Popularne posty