Własny CMS #8 – Przedmioty

Dziś zajmiemy się stworzeniem zakładki z przedmiotami. Najważniejsza uwaga – tworzymy tylko jedną stronę przedmiotów, tj. stronę, na której będą wyświetlane maksymalnie 24 pozycje. Zrobienie menu z wieloma stronami jest możliwe – możecie spojrzeć, jak wykonałem to w Czarnym Smithie. W niniejszym kursie nie będziemy tego robić, bo i tak zagmatwamy niełatwą przecież materię.

Przygotowania

Jeśli sumiennie wykonaliście ostatnią lekcję, w programie powinniście mieć 25 obrazków z przedmiotami znajdującymi się w bazie danych (w tym jeden pusty). Będziemy z nich korzystać także teraz. Standardowo najpierw założenia konstrukcyjne – wyświetlamy nazwę przedmiotu razem z jego liczbą w plecaku. Dodatkowo z części itemów możemy korzystać, np. w celu wyleczenia postaci.

Proponowany przeze mnie układ okienka jest następujący:

Skoro mamy 24 możliwe miejsca w plecaku, musimy stworzyć odpowiednie zmienne. Te o numerach 201 – 224 będą zawierały ID przedmiotu, a zmienne o numerach 241-264liczbę danego przedmiotu.

Sam szablon do menu przedmiotów będzie oczywiście miał koordynaty X 160, Y 120. X pierwszej nazwy itemu to 84, Y to 41, a koordynaty pierwszego numeru – X 155 i Y 41. Tylko tyle musimy wiedzieć, całą resztę zrobimy bez konieczności ręcznego liczenia. Został jeszcze do zrobienia kursor, którego wymiary to 138×16 pikseli. Początkowa pozycja to X 91, a Y 41. Zauważyliście, że aż trzy obrazki mają taką samą koordynatę Y? To dlatego, że wszystkie mają 16 pikseli wysokości, a chcemy je mieć na tej samej linii.

Zostało nam jeszcze przypisanie numerów poszczególnym obrazkom. Z uwagi na to, że nigdy nie będą jednocześnie wyświetlane obrazki z menu Status i z menu Przedmioty, spokojnie możemy użyć tych samych numerów:

  • 150 – czarne tło nakładane na menu
  • 151 – szablon okienka
  • 152 – kursor
  • 153-176 – nazwy przedmiotów
  • 177-224 – liczba przedmiotów

Wyświetlenie przedmiotów

Dla itemów będziemy potrzebowali nowych zmiennych z X, Y i numerem obrazka oraz dwóch zmiennych do przypisywania. W pierwszej kolejności w nowym common evencie ustawiamy zmienne Item X na 84, Item Y na 41, a Item Numer obrazka na 153. Zmiennej Item Przyp ID nadajemy wartość 201 (to jest numer ID zmiennej z pierwszym itemem), a zmiennej Item Przyp Liczba wartość 241 (numer ID zmiennej z liczbą pierwszego itemu). Później wstawiamy 24 warunki dla każdego z przedmiotów sprawdzając, czy dany przedmiot jest w plecaku.

W środku warunku przypisujemy zmiennej, której ID znajduje się w zmiennej o numerze 164 (trzecia opcja w polu Variable komendy Control Variable) wartość 1 (to ID pierwszego przedmiotu), a zmiennej, której ID znajduje się w zmiennej o numerze 165 przypisujemy liczbę sztuk pierwszego przedmiotu w plecaku (Operand -> Item -> Drewniany miecz is in Inventory). Następnie wywołujemy nowy common event, który zaraz stworzymy – Menu-Item-Pokaz.

W nowym common evencie pierwsze, co musimy zrobić to nowej zmiennej Item – Jaki ID przypisać wartość zmiennej znajdującej się w zmiennej 164. Dzięki temu w nowej zmiennej będzie znajdował się aktualny numer ID przedmiotu. Następnie pokazujemy obrazek z wykorzystaniem zmiennych Numer obrazka, X, Y i Jaki ID. Później zwiększamy zmienną Item – Numer obrazka o 1, a zmiennej Licz – Glowna (do pokazywania obrazkow) przypisujemy wartość zmiennej, której ID przechowujemy w zmiennej o numerze 165 (analogicznie, jak wyżej). Dalej wykonujemy następujące operacje na zmiennych:

  • zmiennej 0006:Licz – Numer obr przypisujemy aktualną wartość zmiennej 0163 – Item Numer obrazka;
  • zmiennej 00015:Licz – Obra X przypisujemy wartość zmiennej 0161:Item – X, a później dodajemy do niej 71 (różnica w pikselach między pozycją nazwy i cyfry dla przedmiotu);
  • zmiennej 0016:Licz – Obra Y przypisujemy wartość zmiennej 0162 – Item Y.

Dzięki powyższym zabiegom mamy X oraz Y i numer obrazka, który ma nam pokazać liczbę posiadanych przedmiotów. Wywołujemy zdarzenie odpowiadające za pokazywanie obrazków. Nie wiemy, czy liczba przedmiotów ma jedną, czy dwie cyfry, dlatego po wywołaniu, zmiennej Item Numer obrazka przypisujemy wartość numeru obrazka ze zmiennej 0006 i później dodajemy do tego 1.

Wracamy do common eventa 0014 sprawdzającego itemy. Żeby móc manipulować koorodynatami obrazków powinniśmy wiedzieć, gdzie aktualnie znajduje się skrypt wyświetlający nazwy przedmiotów. Dlatego na samym początku tworzymy nową zmienną Item Poka pozycja i ustawiamy go na 1.

Ponownie przechodzimy do common eventa 15. Po ostatniej komendzie wstawiamy warunek i sprawdzamy, czy nowa zmienna pozycja jest równa 12 (tj. czy itemy zapełniły całą lewą kolumnę okienka). Jeśli tak, zmienne odpowiadające za wyświetlanie obrazków itemów ustawiamy na X = 222, a Y = 41 (to początek drugiej kolumny). W opcji ELSE zwiększamy jedynie Y o 16. Po warunku zwiększamy zmienną z pozycją w menu o 1, a także zwiększamy zmienne 164 i 165 (tam chowamy ID innych zmiennych do itemów) o 1. Dzięki temu kolejne przypisywanie będzie na nowych zmiennych.

Jeśli chodzi o wyświetlanie przedmiotów, to w zasadzie wszystko. Teraz w common evencie 0014 wystarczy tylko dorobić warunki dla każdego z przedmiotów i odpowiednio je zmodyfikować.

Powtórzmy, co do tej pory zrobiliśmy

Ideą tego skryptu jest przypisanie do dwóch tablic wartości odpowiadających ID oraz liczbie przedmiotów, które gracz posiada w plecaku. Dzięki temu, że przypisywanie przedmiotów jest w poszczególnych warunkach, nie ma znaczenia, jakie przedmioty są w plecaku. Skrypt zawsze będzie sprawdzał listę zgodnie z kolejnością wskazaną w tym evencie i przypisywał wartości do pierwszych wolnych z przygotowanych przez nas zmiennych.

Wszystko, co dzieje się w tym common evencie uruchamiane jest tylko wtedy, gdy jakiś przedmiot znalazł się w plecaku. Wykorzystując ustawione na początku poprzedniego eventa wartości wyświetlamy obrazek i, w zależności od pozycji, na której aktualnie jesteśmy, ustawiamy nowe wartości. Całość skryptu wywołać można jedną komendą Call event i wybierając 0014:Menu – Item – Spr.

Nieoczekiwany problem

Specyfika RPG Makera sprawia, że pojawia nam się nieoczekiwany problem. Spróbujcie wywołać nasz skrypt, gdy nie macie w plecaku danego przedmiotu z ekwipunku, ale założyła go jedna z postaci w drużynie. Przedmioty te pojawią się w naszym menu, ale ich wartość będzie wynosić 0! To dlatego, że warunek sprawdzający poszczególne przedmioty weryfikuje także, czy ktoś z drużyny ma je na sobie. Rozwiązanie tego problemu jest wbrew pozorom bardzo proste.

W naszych warunkach z przedmiotami przed wywołaniem common eventa powinniśmy nowej zmiennej przypisać wartość zmiennej, której ID przechowujemy w zmiennej 165. Innymi słowy nowa zmienna będzie zawierać liczbę aktualnie posiadanych w plecaku przedmiotów, których dotyczy warunek. Następnie wstawiamy warunek i sprawdzamy, czy nowa zmienna jest większa od 0. Jeśli tak – wywołujemy common eventa. Nie tworzymy opcji ELSE. Sprawa załatwiona!

Wywołanie menu i nawigacja

Teraz będziemy tworzyć nawigację tak, jak w przypadku menu głównego i statusu. Przechodzimy do common eventa 0002 (główne menu nawigacyjne) i warunku z liczbą 2 (Przedmioty) znajdującego się tam, gdzie wciskamy ENTER. Tworzymy trzy nowe zmienne – X, Y i pozycję kursora w menu item. W warunku najpierw ustawiamy X na 91, następnie Y na 41, a Pozycję kursora na 1. Wyświetlamy czarne tło z przezroczystością oraz tło dla menu item, a następnie wyświetlamy przy pomocy nowych zmiennych obrazek kursora.

Pamiętajcie, że zgodnie z naszą listą, numer obrazka z kursorem to 152. Następnie odgrywamy SOUND ENTER i wywołujemy common event odpowiedzialny za pokazywanie przedmiotów (0014). Na koniec zmieniamy nowy przełącznik MENU – ITEM na ON, a wyłączamy przełącznik 0002 (podobnie jak to robiliśmy przy statusie). Całość wygląda w taki sposób i będzie w większej części powtarzana przy wywoływaniu kolejnych kart z menu:

Dalej także postępujemy analogicznie do zabawy ze Statusem. Tworzymy nowego common eventa, jako Trigger wybierając Autorun, a jako przełącznik MENU – ITEM. W przypadku wciśnięcia klawisza ESC, oprócz zmiany przełączników, usuwamy obrazki z przedziału 150-225. Jeśli chodzi o strzałkę w dół (warunek z liczbą 1) wykonujemy następujące operacje:

  1. sprawdzamy, czy zmienna z pozycją kursora jest równa 12 z opcją ELSE (koniec pierwszej kolumny) – jeśli jest, X, Y i pozycję ustawiamy na wartość początkową;
  2. w opcji ELSE sprawdzamy, czy pozycja jest równa 24 (koniec drugiej kolumny), także zaznaczając ELSE – jeśli warunek się zgadza, ustawiamy X na 229, Y na 41, a pozycję na 13;
  3. w opcji ELSE drugiego warunku zwiększamy Y o 16 i pozycję o 1.

Analogicznie wstawiamy komendy z warunkiem wciśniętej strzałki w górę, modyfikując operacje na X, Y i pozycji obrazka.

Ze strzałkami w bok sprawa jest jeszcze prostsza. W przypadku ruchu w lewo sprawdzamy jedynie, czy pozycja jest mniejsza lub równa 12, a ruchu w prawo – czy pozycja jest większa lub równa 13. Reszta powinna już być dla was prosta. W przeciwieństwie do wyboru postaci w celu zobaczenia jej statusu, tutaj nie bawimy się w sprawdzanie ile mamy itemów pod kątem ruchu kursora – szkoda na to czasu i nerwów, pozwólmy graczowi poruszać się po całym oknie.

Wybór przedmiotu

Prawdziwa zabawa zaczyna się dopiero tutaj. Po wciśnięciu ENTER, w pierwszej kolejności chcemy wiedzieć, jaki przedmiot wybrał gracz. Moglibyśmy oczywiście wstawić tutaj setki warunków sprawdzających, na jakiej pozycji jest kursor, a następnie co w tej pozycji się znajduje, ale po co? Zróbmy to sposobem.

Pamiętacie, że kolejność pokazywania się itemów (z góry na dół zaczynając od lewej kolumny) jest taka sama jak numery pozycji kursora? To nie przypadek. Jeśli dobrze pomyślicie okaże się, że gdy kursor jest na pozycji np. 12, wskazuje na zmienną znajdującą się pod numerem 212. Jeśli przesuniemy go na pozycję 3, będzie wskazywał zmienną numer 203. Nietrudno zauważyć zależność – do pozycji kursora wystarczy dodać liczbę 200, a otrzymamy zmienną, na którą wskazuje!

Dlatego w pierwszej kolejności w warunku z wciśniętym ENTEREM tworzymy nową zmienną (Item – Obliczenia) i przypisujemy jej wartość pozycji kursora, a następnie dodajemy do niej 200. Teraz do kolejnej nowej zmiennej (Item – Co pokazuje) przypisujemy wartość zmiennej, której ID znajduje się w zmiennej Item – Obliczenia. Dzięki temu w nowej zmiennej będziemy mieli ID przedmiotu, który wskazuje kursor! Jeśli utworzycie jeszcze jedną zmienną i do Item – Obliczenia dodacie 40, analogicznie jak wyżej, otrzymacie nową zmienną z liczbą danego przedmiotu.

Dalej tworzymy warunek, czy nowa zmienna jest równa 0 – jeśli tak, nie robimy nic. Wszystkie kolejne działania wykonujemy w opcji ELSE tego warunku (można zrobić ten warunek bez opcji ELSE, ale wybrałem taką możliwość z uwagi na przejrzystość).

Jeśli potestujecie na tym etapie skrypt okaże się, że po sprzedaży wszystkich przedmiotów danego rodzaju, jego ID nie znika ze zmiennych. Dlatego w common evencie 0013 (sprawdzanie przedmiotów) na początku musimy wyzerować nasze tablice z przedmiotami i ich wartościami).

Wracamy do naszej opcji ELSE w nawigacji z przedmiotami. Najpierw usuwamy grafikę twarzy (gdyby się okazało, że przed chwilą z kimś rozmawialiśmy) i ustawiamy Display Text Options w taki sposób, by okienko pojawiało się zawsze na dole i mogło zasłaniać bohatera. Wywołujemy również SOUND ENTER. Dalej tworzymy po kolei warunki sprawdzające, czy zmienna Item – Co pokazuje jest równa 1, 2, 3 i tak dalej aż do 24 – to są bowiem nasze ID przedmiotów w bazie. Wewnątrz warunków wstawiamy informację o konkretnym przedmiocie. Trudność pojawi się dopiero w przypadku tych, które mają jakieś aktywne działanie, np. leczą.

Przygotowania do aktywnych itemów

Jeśli przejrzymy naszą listę itemów, znajdziemy tam przedmioty o następujących właściwościach:

  • leczenie HP;
  • leczenie MP;
  • leczenie statusów;
  • wskrzeszenie;
  • zwiększanie na stałe ataku.

Wydaje się, że najprostszym wyjściem jest stworzenie nowego okienka, w którym gracz będzie mógł wybrać, na kim chce wykorzystać przedmiot. Moglibyśmy co prawda zrobić wybieranie podobne jak przy statusie, ale nie chcę niepotrzebnie mieszać.

Zanim zaczniemy projektować nowe okienko, musimy sprawić, że program będzie spisywał cztery statystyki postaci i zapisywał je do naszych tablic (atak, obrona, inteligencja, zręczność). Do naszych tablic z czterema bohaterami w menu (zmienna 0021 i następne) dodajemy dla każdego bohatera kolejne cztery zmienne odpowiedzialne za statystyki. Teraz modyfikujemy common eventa 0004 przypisującego do tablic dane bohaterów w taki sposób, by dopisywał nowe (czyli zwiększamy zmienną o 1 i dajemy nowe przypisania). Nie ruszamy common eventa 0005, ponieważ nie chcemy zmienić nic w wyświetlaniu.

Teraz projektujemy okienko, które będzie zawierało wszystkie zmienialne informacje. Ja proponuję coś takiego:

Jak się zapewne domyślacie, teraz czeka nas standardowa zabawa, czyli sprawdzanie koordynat dla obrazków i wybieranie ich numerów.

Koordynaty dla nazwy przedmiotu oraz pierwszego bohatera w okienku:

  • item: X 65, Y 89;
  • imię postaci: X 43, Y 105;
  • stan postaci: X 118, Y 105;
  • HP: X 153, Y 105;
  • MAX HP: X 184, Y 105;
  • MP: X 205, Y 105;
  • MAX MP: X 230, Y 105;
  • ATK: X 251, Y 105;
  • DEF: X 271, Y 105;
  • INT: X 291, Y 105;
  • AGI: X 311, Y 105.

Numery obrazków:

  • 250 – czarne tło nakładane na menu;
  • 251 – szablon okienka;
  • 252 – kursor;
  • 253-255 – item i jego liczba;
  • 256 – imię postaci;
  • 257 – status postaci;
  • 258-265 – HP i MAX HP;
  • 266-271 – MP i MAX MP;
  • 272-274 – ATK;
  • 275-277 – DEF;
  • 278-280 – INT;
  • 281-283 – AGI;
  • 285-315 – obrazki dla drugiego bohatera;
  • 316-346 – obrazki dla trzeciego bohatera;
  • 347-377 – obrazki dla czwartego bohatera.

Czyścimy menu z tymczasowych danych i importujemy do programu. Tworzymy je, podobnie jak szablon do głównego menu, w pięciu wersjach (różni się kreseczkami).

Nowe okienko

Jedną z podstawowych zasad pisania zaawansowanych skryptów, nie tylko w RM, jest to, by maksymalnie ograniczać kod. W RPG Makerze dyrektywa ta działa w ten sposób, że jeśli jakiś fragment kodu powtarzany jest wiele razy, lepiej umieścić go w odrębnym common evencie i wywoływać w miarę potrzeby, niż za każdym razem kopiować jego treść. Część dotychczasowej pracy moglibyśmy skrócić w taki właśnie sposób, ale nie chciałem niepotrzebnie mieszać.

W każdym warunku z aktywnym itemem będziemy mieli fragment tego samego kodu, czyli pokazanie nowego okienka i zmiana nawigacji, dlatego warto umieścić to w odrębnym common evencie. Dlatego w nowym common evencie 0018:Men Itm – Wyw okien pokazujemy czarne tło i menu zgodnie z wcześniejszymi ustaleniami i przy sprawdzeniu liczby drużyny (robiliśmy to już przy głównym menu).

W dalszej kolejności wywołujemy nowego common eventa, który będzie pokazywał tylko nazwę i liczbę wybranego przedmiotu (to ważne, bo ten fragment też będziemy wywoływali więcej niż jeden raz).

Teraz czas na wyświetlenie informacji o postaciach. Maksymalnie mamy cztery postacie, które moglibyśmy pokazać jednym common eventem, tak zresztą robiliśmy już wcześniej. Czasami warto jednak złamać zasadę skracania wszystkiego, co możliwe i rozbić event na kilka mniejszych (najlepiej widać to w bebechach mojego Garnizonu – niemal wszystkie wyświetlenia liczb robiłem na pałę w oddzielnych common eventach). Co za tym przemawia? Po pierwsze, łatwiej odnaleźć się w takich eventach. Po drugie, mamy większą kontrolę nad tym, co się dzieje na ekranie. Przede wszystkim jednak, rozbicie kodu na kilka mniejszych zdarzeń sprawia, że w przypadku zmiany informacji nie musimy ponownie obliczać i wyświetlać całego okna, a tylko jego część. Nie powinniśmy tworzyć skryptów, które wykonują różne operacje bez potrzeby. Na tym poziomie nie będzie to raczej zauważalne dla lagu w grze, ale warto uczyć się dobrych nawyków jak najwcześniej.

W związku z tym tworzymy cztery nowe common eventy bez Triggera i wyświetlamy w nich informacje z czterech tablic z bohaterami bazując na danych, które przygotowaliśmy wcześniej.

Teraz wracamy do common eventu 0018 i po wyświetleniu szablonu okienka wstawiamy warunki sprawdzające, ile dokładnie mamy członków drużyny. Od tego zależeć będzie, ile eventów z informacjami wywołamy.

Nawigacja

Czas przejść do nawigacji, w której wykorzystam motywy z lekcji o Statusie. Najpierw kursor do nowego okna:

W common evencie 0018 (wyświetlającym nowe okienko) tworzymy nowe zmienne dla kursora i ustawiamy jego X na 42, Y na 104, a pozycję na 1. Następnie wyświetlamy obrazek, wskazując mu liczbę 252. Na samym końcu tego eventa włączamy przełącznik 0005:MENU – AKTYW ITEM (tu będzie nowa nawigacja), a wyłączamy przełącznik 0004:MENU – ITEM.

Czas na stworzenie nowego common eventa z nawigacją dla naszego okienka. Powinniście już wiedzieć, jak zrobić ESC. Strzałki w górę i w dół – tak samo jak przy Statusie.

Dalszą część eventa można rozwiązać na kilka sposób, ja proponuję stworzyć nową tablicę ze zmiennymi, gdzie będziemy przypisywać informacje z wybranej pozycji w nowym okienku. Następnie w nowym common evencie tworzymy cztery warunki ze sprawdzeniem, na której pozycji jest aktualnie kursor i w zależności od niej do tablicy przenosimy wartości konkretnej postaci:

Następnie w nawigacji wstawiamy warunki dla wszystkich możliwych aktywnych przedmiotów (są to przedmioty o ID 16-22 i 24). W pierwszym warunku odpowiedzialnym za leczenie HP (ID 16 to Mała maść) sprawdzamy, czy zmienna HP z nowej tablicy jest mniejsza niż MAX HP, jeśli nie – w opcji ELSE dajemy tylko SOUND ERROR (nowy common event) i nic więcej. Nie chcemy przecież, żeby gra zużyła przedmiot, który nic nam nie dał.

Mała maść leczy 150 HP, dlatego wewnątrz warunku odnawiamy postaci, której ID znajduje się w naszej tablicy, 150 HP.

Później zabieramy graczowi jeden przedmiot znajdujący się w zmiennej wykorzystywanej do sprawdzania, o jaki item chodzi. Zmniejszamy jednocześnie zmienną 0174:Item – Liczba Pokazu o 1 (tutaj zamieszczona jest liczba wybranego przez nas przedmiotu).

W tym momencie konkretnej postaci odnowiono HP i zabrano przedmiot, ale jeszcze nie widać tego na ekranie. Dlatego tworzymy nowy common event Men Itm – Check, który wywołamy po użyciu przedmiotu. W nowym common evencie najpierw wywołujemy event 0014, żeby zaktualizować główne okno z przedmiotami oraz common event 0004 (tam przypisywane są cechy postaci do zmiennych).

Następnie sprawdzamy, czy aktualna liczba wybranego itemu jest większa niż 0. Jeśli tak, robimy cztery warunki sprawdzające pozycję w menu i w zależności od niej wywołujące jeden z common eventów 0020 – 0023 (aktualizują okienko). Wywołujemy także common event odpowiedzialny za pokazanie itemu w nowym okienku. Jeśli natomiast liczba przedmiotów nie jest większa od 0, czyli się skończyła, powinniśmy zamknąć okno. Dlatego w opcji ELSE wstawiamy takie komendy, jak w przypadku zamknięcie nowego okienka klawiszem ESC.

Podczas testów pojawiły się pewne problemy związane z tym, że pewne obrazki nie są usuwane (np. gdy liczba itemów spada podczas używania do wartości jednocyfrowej lub gdy kończy nam się item. Dlatego na początku common eventów 0014 i 0019 odpowiedzialnych za obrazki trzeba na samym początku te obrazki wyzerować zgodnie z tabelką z numerami.

Warunek z jednym przedmiotem wygląda tak:

Z kolei common event sprawdzający wyświetlenia prezentuje się następująco:

Na bazie powyższych porad nie powinniście mieć kłopotów ze stworzeniem pozostałych przedmiotów, których warunki należy umieszczać w common evencie 0024. Było ciężko, ale wreszcie koniec – zakładka Przedmioty jest gotowa!

Prawie bym zapomniał! Podczas testowania okazało się, że można wykorzystać przedmiot leczący na martwą postać i nic z tego nie mieć. Dlatego wewnątrz warunków przedmiotów leczących trzeba jeszcze sprawdzić, czy postać żyje (tj. czy jej stan nie jest równy 1, co oznacza śmierć).

ŚCIĄGNIJ PROJEKT Z LEKCJI

Michał „Michu” Wysocki

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.