Własny CMS #6 – Pokazujemy drużynę

W trakcie ostatnich 5 lekcji zdobyliśmy wszystkie podstawowe narzędzia, które umożliwią nam konstruowanie dobrze wyglądających menu. Założenie jest takie, że podstawowe informacje o drużynie pojawiają się zaraz na początku wywołania, a po wybraniu ekwipunku lub technik, będziemy mogli spośród tych postaci wybrać tę, której dane szczegółowe chcemy zobaczyć.

Projektowanie menu

W naszej drużynie jednocześnie może znaleźć się czwórka bohaterów. Z tą myślą musimy przystąpić do przeanalizowania, jak najkorzystniej rozlokować informacje w okienku. Jeśli z głównego okna menu usuniemy krawędzie i 2 piksele czerwonego tła z każdej strony (zawsze warto zostawiać sobie mały zapas, żeby poszczególne elementy menu nie stykały się ze sobą), uzyskamy coś takiego:

Sprawdziłem kilka wariantów i najlepiej byłoby po prostu podzielić menu na cztery płaskie paski. Na szczęście okienko w wysokości jest podzielne przez 4. Dla jednej postaci wygląda to tak:

W głównym oknie menu chcemy mieć następujące informacje dla każdej z postaci:

  • imię i stan (trucizna, paraliż itd.);
  • HP i MP (aktualne i maksymalne);
  • poziom i doświadczenie.

Dlatego w RM przygotowujemy odpowiednie teksty i je wyklejamy w programie Paint.

Znaki @ obok Lary oznaczają maksymalną długość imienia lub stanu. Warto w ten sposób przygotowywać szablony, bo dzięki temu unikamy przykrych niespodzianek w przyszłości. Razem z przygotowanymi wcześniej cyframi ostateczny projekt wygląda następująco:

Gdy już ustawimy wszystkie pozycje liczb w RM, będziemy mogli wyczyścić z powyższych cyfr szablon, ale na tę chwilę zostawmy go tak, jak jest. Później dowiecie się, dlaczego.

Teraz zostało nam jeszcze stworzenie pięciu plików picture z obrazkami twarzy naszych bohaterów (które nazywamy „faceX”, gdzie X to numer postaci w bazie – czyli obrazek z Larą to „face1”):

Analogicznie robimy z imionami nazywając je nameX. Pamiętajcie, by wszystkie obrazki, niezależnie od liczby liter, miały taki sam rozmiar!

Przygotowanie tablicy zmiennych

Nie korzystamy z Maniacs Patcha, w związku z czym mówienie tutaj o tablicy zmiennych jest bardziej teoretyczne, niemniej jednak warto w ten sposób myśleć o grupach zmiennych. Dla każdego z czterech miejsc na postać w menu musimy stworzyć takie same zmienne (w przykładowym projekcie jest pięć możliwych postaci, żeby sprawdzić prawidłowość skryptów). Będziemy potrzebować zmiennej odpowiadającej za numer postaci w bazie danych, HP i max HP, MP i max MP, stan, poziom i doświadczenie. Bardzo proszę, byście stworzyli zmienne dokładnie o takich samych numerach, jak poniżej – bez tego skrypt się rozkraczy!

Następnie tworzymy jeszcze jeden zestaw oznaczony jako X – posłuży on do wyświetlania obrazków:

Lista obrazków

Pamiętacie jeszcze o naszej liście z numerkami obrazków? Teraz się przyda. Każda z czterech postaci zabierze łącznie 26 numerów (po 1 na twarz, imię i stan, 2 na poziom, 8 na HP, 6 na MP i 7 na EXP). Proponuję rozpisać je następująco:

  • 10 – obrazek czarnego tła
  • 13 – czerwone tło menu
  • 14 – kursor główne menu
  • 16 – napisy w menu
  • ——–
  • 30 – Boh 1 Twarz
  • 31 – Boh 1 Imię
  • 32 – Boh 1 Stan
  • 33-36 – Boh 1 HP
  • 37-40 – Boh 1 MAX HP
  • 41-43 – Boh 1 MP
  • 44-46 – Boh 1 MAX MP
  • 47-48 – Boh 1 Poziom
  • 49-55 – Boh 1 EXP
  • ——–
  • 60 – Boh 2 Twarz
  • 61 – Boh 2 Imię
  • 62 – Boh 2 Stan
  • 63-66 – Boh 2 HP
  • 67-70 – Boh 2 MAX HP
  • 71-73 – Boh 2 MP
  • 74-76 – Boh 2 MAX MP
  • 77-78 – Boh 2 Poziom
  • 79-85 – Boh 2 EXP
  • ——–
  • 90 – Boh 3 Twarz
  • 91 – Boh 3 Imię
  • 92 – Boh 3 Stan
  • 93-96 – Boh 3 HP
  • 97-100 – Boh 3 MAX HP
  • 101-103 – Boh 3 MP
  • 104-106 – Boh 3 MAX MP
  • 107-108 – Boh 3 Poziom
  • 109-115 – Boh 3 EXP
  • ——–
  • 120 – Boh 4 Twarz
  • 121 – Boh 4 Imię
  • 122 – Boh 4 Stan
  • 123-126 – Boh 4 HP
  • 127-130 – Boh 4 MAX HP
  • 131-133 – Boh 4 MP
  • 134-136 – Boh 4 MAX MP
  • 137-138 – Boh 4 Poziom
  • 139-145 – Boh 4 EXP

Mechanika pokazywania drużyny

Nasz skrypt pokazywania drużyny dzielimy na dwa Common eventy. Jeden (0004:Menu – Sprawdz team) będzie sprawdzał po kolei członków drużyny i gdy taki się pojawi, wywoływał drugi (0005:Menu – Poka team), który pokaże obrazki.

Common event 0004 zaczynamy od ustawienia nowej zmiennej 0012:Menu – Poz druzyny na 1. Oznacza to, że zaczynamy nasze sprawdzanie od pierwszego miejsca w menu od góry. Następnie nową zmienną 0013:Menu – Przypis var ustawiamy na 21. To zmienna, w której będzie przechowywany numer pierwszej postaci w menu.

Tworzymy warunek i sprawdzamy, czy pierwsza postać z listy – Lara – jest w drużynie. Jeśli tak, ustawiamy komendę Control Variables jak na obrazku poniżej.

Co właściwie zrobiliśmy? Przypisaliśmy do zmiennej, której numer jest wartością zmiennej 0013 liczbę 1. Wcześniej zmienną 0013 ustawiliśmy na 21, czyli po wykonaniu tej operacji, zmienna 0021:Boh 1 – Numer będzie miała wartość 1. Następnie zwiększamy wartość zmiennej 0013 o 1 i ponownie przypisujemy znajdującej się w niej zmiennej wartość, tym razem będzie to HP Lary. Znowu zwiększamy zmienną 13 o jeden i przypisujemy znajdującej się w niej zmiennej kolejną wartość utworzonej wcześniej przez nas listy. Gdy dojdziemy do MAX MP i kolejny raz zwiększymy wartość zmiennej 13, przechodzimy do zakładki w bazie danych odpowiadającej za stany i tworzymy trzy jak na obrazku.

Uwaga. Nasz skrypt nie będzie pokazywał kilku stanów, a tylko ten, który będzie miał najmniejsza liczbę. Nie chcę komplikować i tak skomplikowanej sprawy.

Wracamy do naszego warunku z Larą i po ostatnim zwiększeniu zmiennej 0013 wstawiamy warunek czy Lara ma stan nr 1, czyli Śmierć (zaznaczamy opcję ELSE). Jeśli tak, ustawiamy zmienną zachomikowaną w zmiennej 0013 na jeden. W polu ELSE wstawiamy nowy warunek ze stanem numer dwa i ustawieniem zmiennej na 2, a w jego opcji ELSE – kolejny warunek ze stanem numer 3.

Po naszych warunkach ze stanami (ale wciąż wewnątrz warunku z Larą), znowu zwiększamy zmienną 0013 i przypisujemy poziom Lary, a na końcu doświadczenie. Po wszystkim zwiększamy wartość zmiennej 0012 o 1, a zmiennej 0013 o 13. Dzięki temu nowe przypisywanie (przy założeniu, że w drużynie jest druga postać) zacznie się od zmiennej o ID 41, czyli numerze bohatera nr 2. Całość wygląda tak:

Gdy teraz wywołamy zdarzenie komendą Call Event, rożne wartości atrybutów Lary zostaną przypisane do zmiennych dla pierwszej postaci w menu:

Następnie kopiujemy cały wielki warunek z Larą i wstawiamy za nim kolejne warunki, odpowiednio zmodyfikowane dla każdej z postaci w bazie danych. Całość jest już za długa, żeby ją pokazać.

Podsumowując, co robi nasz skrypt?

Sprawdza, czy dana postać jest w drużynie. Jeśli jest, przypisuje jej wartości do pierwszego wolnego zestawu zmiennych (BOH 1, BOH 2, BOH 3 lub BOH 4). Dzięki temu, że wcześniej każdy zestaw przygotowaliśmy tak samo, możemy tylko zwiększać zmienną 0013 o jeden i przypisywać do nowej zmiennej, której numer został w niej zapisany. Można też robić to ręcznie, ale po co się przemęczać?

Dzięki temu, że wszystkie przypisania znajdują się w warunkach, nie ma znaczenia, które postacie są w drużynie, a których nie ma. Zawsze będzie ich maksymalnie 4, więc nie powinny pojawić się błędy.

Jedna wada tego skryptu, praktycznie nie do przeskoczenia bez srogich zabaw ze zmiennymi gdy postacie są w trakcie gry dodawane do drużyny, to że w naszym menu postacie nie wyświetlają się zgodnie z kolejnością w drużynie. U nas zawsze będzie to zgodnie z kolejnością w bazie danych – nawet jak Lara jest na trzecim miejscu w zespole, u nas będzie na pierwszym, bo jest pierwsza w bazie danych.

Umieszczanie „tablicy” zmiennych w kopii do pokazywania obrazków

W porządku, teraz czas na wykorzystanie piątego zestawu zmiennych. Pokazując różne liczby na wcześniej przygotowanym skrypcie chcemy pracować na zmiennych z piątej „tablicy” – BOH X od 101 do 108 – dzięki temu skrypt napiszemy raz, a nie cztery razy dla każdego miejsca w menu. W tym celu musimy sprawić, by po każdym warunku z przypisywaniem cech danej postaci, wszystkie wartości zmiennych trafiły także do zmiennych BOH X. Obrazki będziemy pokazywać przed przypisaniem nowych zmiennych, także wszystko powinno sprawnie działać.

W warunku z Larą przechodzimy na jego początek. Jeszcze przed pierwszą operacją wstawiamy nowe Control Variable i przypisujemy wartość zmiennej 13 do nowej zmiennej – 0014:Menu – Przypisywanie. Dzięki temu będziemy wiedzieli, gdzie zaczyna się aktualnie używana „tablica”. Taką samą komendę dajemy w każdym warunku z postacią.

Tworzymy nowy common event – 0006:Menu – Przypis Var bez Triggera, który będzie nam przypisywał zmienne z konkretnej tablicy do zbioru BOH X. Następnie na samym końcu warunku z Larą wywołujemy nowy common event przy pomocy komendy Call Event.

Poniżej zaprezentuję wersję ręczną, ale spokojnie można to zrobić pętlą/etykietą i odpowiednią inkrementacją zmiennych. W nowym warunku wstawiamy szereg operacji, gdzie przypisujemy do zmiennych ze zbioru BOH X kolejne wartości zmiennych umieszczone w zmiennej 0014. Po każdym przypisaniu zwiększamy tę zmienną o 1, żeby wciąż nie dodawać tej samej wartości. Całość powinna wyglądać tak:

Wspomniany Call event należy umieścić w każdym warunku z postacią.

Pokazywanie obrazków twarzy

No dobrze, mamy już wszystkie wartości w zmiennych, czas na pokazanie obrazków. Żeby ustalić odpowiednie X i Y obrazków, ja zawsze importuję sobie już wypełniony szablon (dlatego go wcześniejszy nie czyściliśmy), a następnie sprawdzam to ręcznie. Zrobiłem to przed chwilą i wyszło mi, że dla pierwszej postaci ustawienia X i Y obrazków są następujące (dla liczb są to ustawienia pierwszej cyfry):

  • grafika twarzy – X 137, Y 42;
  • imię – X 201, Y 26;
  • stan – X 287, Y 26
  • HP – X 201, Y 42;
  • MAX HP – X 232, Y 42;
  • MP – X 271, Y 42;
  • MAX MP – X 296, Y 42;
  • Poziom – X 212, Y 58;
  • EXP – X 280, Y 58.

Kluczowa dla dalszego skryptu kwestia jest taka, że każda postać ma taki sam schemat obrazków, które będą różniły się w kwestii umiejscowienia wyłącznie na osi Y (góra – dół), na osi X zawsze będą takie same.

Przechodzimy teraz do common eventa 0005:Menu – Poka team i ustawiamy wartość zmiennej 0007 na 137 (to jest pozycja X grafiki twarzy). Następnie ustawiamy zmienną 0008 na 42 (Y grafiki twarzy w pierwszej pozycji). X grafiki dla każdej z postaci zawsze będzie takie samo, ale nie wiemy, na której pozycji w menu ma ona zostać wyświetlona. Następnie zmienną 0006 (Numer obrazka) ustawiamy na 30 (to numer grafiki twarzy pierwszej pozycji w menu z naszej listy). Później dajemy warunek sprawdzający czy zmienna 0012:Menu – Poz druzyny równa się 2 (tj. czy wyświetlamy drugą postać) i dajemy mu opcję ELSE. Wewnątrz warunku dodajemy do zmiennej 0008 wartość 52 (to różnica w wysokościach pomiędzy grafikami twarzy w menu), a zmienną 0006 ustawiamy na 60 (numer grafiki twarzy drugiej postaci w menu). Następnie w opcji ELSE sprawdzamy, czy zmienna 0012 jest równa 3, a jeśli tak – dodajemy 104 (to dwie odległości od pierwszego miejsca) i numer obrazka ustawiamy na 90. Analogicznie postępujemy z czwartym miejscem. Całość powinna wyglądać tak:

Teraz po wszystkich warunkach wyświetlamy obrazek jak poniżej:

Dzięki temu program będzie wyświetlał grafikę twarzy dowolnego bohatera, którego akurat sprawdzamy, bez konieczności tworzenia dziesiątek warunków.

Wracamy do common eventa 0004:Menu Sprawdz team i pod koniec każdego z warunków z postaciami, zaraz po Call Evencie wywołującym przypisywanie, tworzymy nowy Call Event, tym razem dla 0005:Menu Poka team.

Po odpaleniu skryptu pojawił się problem – nie jest wyświetlana grafika na pierwszej pozycji. To dlatego, że nasze Call Eventy w każdym z warunków daliśmy już po zwiększeniu zmiennej 0012 o jeden. Poprawiamy to i przesuwamy je przed tę operację.

Gdy teraz odpalicie skrypt (tj. wywołacie common event Menu – Sprawdz team), pokażą nam się twarze postaci! Możecie poeksperymentować z różnymi składami drużyny!

Pokazywanie imion

Przechodzimy do common eventa 0005:Menu – Poka team i po wyświetleniu obrazka z twarzą zwiększamy numer obrazka o 1 (dzięki temu numer będzie większy niezależnie od tego, którą postać wyświetlaliśmy przed chwilą). Teraz musimy ustawić koordynaty dla imienia. Nie chcemy wciąż wpisywać tego ręcznie, dlatego zastosujemy pewną sztuczkę. Wracamy do naszej listy z koordynatami obrazków i patrzymy na dwie pozycje:

  • grafika twarzy – X 137, Y 42;
  • imię – X 201, Y 26.

Jak wyglądają te wielkości względem siebie? X imienia jest większy od X grafiki twarzy o 64 piksele, a Y mniejszy o 16, niezależnie od tego, którą postać akurat wyświetlano. Dlatego wystarczy o takie wartości zmodyfikować zmienne Licz – X i Licz – Y (które posiadają przecież wciąż koordynaty twarzy) i już będziemy mieli gotowe dane do wyświetlenia naszych imion! Na koniec dajemy analogiczne pokazanie obrazka jak w przypadku twarzy (tylko wybierając jeden z plików name), także ze zmienną BOH X – Numer.

Pokazywanie stanów postaci

W dalszej kolejności będziemy pokazywali stan postaci w drużynie. Musimy sobie zatem przygotować trzy obrazki z nazwami stanów takimi samymi, jak te w bazie danych. Analogicznie jak face i imiona, nazywamy je stan0, stan1, stan2 i stan3. Pamiętajcie, by były to obrazki o takich samych wymiarach jak imiona, ponieważ dla takich właśnie ustawialiśmy koordynaty. Stan0 to plik pusty, który musi znaleźć się w programie, żeby skrypt nie wykrzaczał się, gdy postać będzie w normalnym stanie.

Podobnie jak wcześniej, po pokazaniu imienia zwiększamy zmienną numer obrazka o 1 i sprawdzamy nasze koordynaty X oraz Y pomiędzy imieniem i stanem. X jest większe o 86 (tak też zmieniamy zmienną X obrazka), a Y się nie zmienia. Na końcu dajemy Show Picture z jednym z obrazków stanX oraz zmienną 0106:BOH X – Stan. Póki co nasz common event prezentuje się następująco:

Wyświetlanie HP i MAX HP

Teraz przechodzimy do sekcji, gdzie będą wyświetlane liczby. Jak część z was pewnie zdążyła zauważyć, w naszym common evencie odpowiadającym za liczby (0003:Pokaz liczbe) używane są te same zmienne X i Y co przy obliczaniu pozycji w menu. Nie wiemy, czy liczba HP zamknie się w jednej, dwóch, czy większej liczbie cyfr – w zależności od tego wartość na osi X będzie inna. Jak temu zaradzić? Bardzo prosto – w powyższym evencie z liczbą podać nowe zmienne dla X i Y obrazka. Ja wprowadziłem zmienne 0015:Licz Obra – X oraz 0016:Licz Obra Y.

Wracamy do common eventa 0005 z wyświetlaniem poszczególnych elementów menu. Różnica pomiędzy pozycją X stanu i HP to -86, a pozycją Y to +16, dlatego o tyle modyfikujemy zmienne X oraz Y, analogicznie jak wyżej, ale najpierw zwiększamy numer obrazka o 1. Teraz wartość zmiennych X i Y z tego eventu przenosimy do zmiennych X oraz Y, które niedawno stworzyliśmy w evencie z obrazkiem. Następnie do zmiennej 0009:Licz – Glowna przenosimy wartość zmiennej 0102: BOH X – HP. Na końcu komendą Call event wywołujemy common event 0003 z pokazywaniem liczb.

Następnie na bazie tego samego kodu tworzymy wyświetlanie MAX HP pamiętając, żeby zwiększyć jedynie pozycję X o 31, ponieważ pozycja Y pozostaje bez zmian. Powinno wyglądać to tak:

MP, MAX MP, LEVEL i EXP

Analogicznie jak wyżej postępujemy w przypadku pozostałych czterech wartości liczbowych. Zawsze pamiętajmy o zwiększaniu numeru obrazka oraz o wzajemnym położeniu wcześniej ustalonych pozycji X oraz Y (dla MP znów będziemy zmieniać tylko X, dla poziomu X oraz Y, a dla EXP-a tylko X). Po wprowadzeniu wszystkich komend i odpaleniu menu, powinno to wyglądać w ten sposób:

Coś pusto, prawda?

Stałe elementy menu

Wszystko dlatego, że nie mamy stałych elementów przy każdej postaci, takich jak napisy HP czy ukośniki. Teraz nauczymy się, jak zrobić je szybko i bez nadmiernego obciążania programu. Potrzebne nam będą wyczyszczone szablony w czterech wersjach oraz jeden pusty. Pliki, tradycyjnie, nazywamy szablon0, szablon1 itd.

Po zaimportowaniu powyższych grafik wracamy do common eventa 0005:Menu – Poka team i tam, jeszcze przed pokazaniem grafiki twarzy, do nowej zmiennej 0017:Menu – Party size przypisujemy z pola Other liczbę członków w naszej drużynie (czyli Party Size). Musimy pokazać nowy obrazek, wracamy więc do listy z numerami obrazków i sprawdzamy, co jest wolne. Weźmy numer 25. Po przypisaniu powyższej zmiennej pokazujemy obrazek ze standardowym X (160) i Y (120) o numerze 25 z wykorzystaniem jednego z plików party i zmiennej 17. Dzięki temu, w zależności od tego, ilu członków ma drużyna, tyle szablonów pojawi się na ekranie.

Zebranie wszystkiego do kupy

Nasz common event odpowiadający za pokazanie drużyny (0004:Menu – Sprawdz team) jest gotowy. Działa w następujący sposób:

  1. sprawdza, czy dana postać jest w drużynie;
  2. jeśli jest – przypisuje wartości jej cech do pierwszego wolnego zestawu zmiennych odnoszących się do czterech miejsc w menu;
  3. tymczasowo te same wartości przypisuje do piątego zestawu służącego do obliczeń;
  4. przy pomocy common eventa 0005 pokazuje obrazki na bazie ustalonych cech.

Dzięki temu, że jest ustawiony bez Triggera, działa tylko wtedy, gdy go wywołamy. Dlatego musimy teraz udać się do common eventa 0001 odpowiedzialnego za wywołanie całego menu i pod koniec warunku sprawdzającego wciśnięcie klawisza (przed zmianą przełącznika 0002 na ON) wywołujemy common event 0004. Teraz, gdy odpalimy menu na naszej mapce, wszystko będzie wyglądać tak, jak trzeba. A dzięki temu, że przy wyjściu z menu ustawiliśmy szeroki zakres usuwania obrazków, bez problemów będziemy mogli menu wywołać ponownie! No i nowe obrazki nie przeszkadzają w poruszaniu kursorem.

ŚCIĄGNIJ PROJEKT Z LEKCJI

Michał „Michu” Wysocki

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

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