Witajcie! Jako że mam teraz dość dużo czasu, postanowiłem napisać wam mały poradnik. Zapewne widzieliście już ładne CMSy (Custom Menu System), w których to okienka płynnie wjeżdżają na ekran, a po wyjściu wyjeżdżają z niego. Na pierwszy rzut oka można pomyśleć, że autor musiał trochę przesiedzieć pisząc kolejne linijki kodu. Nic bardziej mylnego! Proces tworzenia takiego efektu jest bardzo prosty. Zapraszam do czytania.
1. Projektowanie
Na początku najlepiej jest wszystko sobie zaplanować, żeby potem łatwo i przyjemnie się kodowało. Jerzy Grębosz w książce Symfonia C++ podzielił pracę nad programem (dotyczy programowania OO - orientowane obiektowo) na następujące fazy:
1. Rozpoznanie problemu
2. Projektowanie
3. Implementacja (kodowanie)
4. Testowanie
Pierwszy punkt przedstawiłem we wstępie, także teraz zajmiemy się dalszymi etapami.
A więc, co chcemy zrobić? Po podejściu do NPC(Non-Playable Character) na ekran mają nam się “wsunąć” dwa okienka. Dobrze by było te okienka zrobić, ale ten poradnik dotyczy czego innego. Jeśli ktoś ma problem z okienkami to zachęcam do poczytania tego -> Klik! W programie już mamy gotowych sporo okienek. My wybierzemy sobie dwa. Będą to Window_Gold oraz Window_Steps (najmniejsze, najprostsze). Kolejną rzeczą jest ustalenie pozycji tych okienek na mapie. Pomocną rzeczą okaże się sprawdzenie ich wymiarów. Wchodzimy w edytor skryptów (F11), a następnie w zakładkę Window_Gold. Metoda super() tworzy obiekt nadklasy, czyli w tym wypadku Window_Base (dziedziczenie). Niezbędą rzeczą jest podanie pozycji okna oraz wymiarów w metodzie super(). Właśnie z tego miejsca odczytujemy wymiary:
Window_Gold -> 160,64
Window_Steps -> 160,96
Powiedzmy, że okienko z ilością złota będzie miało współrzędne (200,100), a drugie okienko będzie tuż pod pierwszym (200,164). Przypominam, że program rysuje okienko zaczynając od lewego górnego rogu.
Co teraz? Window_Gold będzie wjeżdżało od strony lewej, natomiast Window_Steps od strony przeciwnej. Warto ustalić sobie pozycje okienek gdy będą poza ekranem. Cały proces ilustrują dwa poniższe obrazki:


2. Kodowanie
Nasze okienka będą zainicjowane w nowej klasie, którą zaraz się zajmiemy. Tworzymy nową zakładkę i nadajemy jej nazwę. Nazwa zakładki nie ma najmniejszego znaczenia dla programu, ma zaś dla użytkownika. Scene_Okienka - ot, “byle jaka” nazwa, ale jest. Ważne jest aby ta klasa znajdowała się niżej niż Window_Gold oraz Window_Steps, gdyż będzie do się do nich odwoływać.
Zapewne przeglądałeś nie raz podstawowe klasy RPG Makera. Łatwo zauważyć, że w każdej znajdują się metody main oraz update. Bez nich ani rusz. U nas dodatkowe metody to appear oraz disappear, które będą odpowiadały kolejno za wjeżdżanie oraz wyjeżdżanie okna. Dobrze jest wykonać sobie wstępny szkielet projektu:
W klasie main ma nastapić proces inicjacji naszych okienek. Od razu ustalmy ich pozycję (poza ekranem) oraz stwórzmy dwa przełączniki, które będą odpowiadały za ruch okienek. Żeby pojawiło nam się tło mapy zamiast czarnego ekranu wystarczy stworzyć obiekt Spriteset_Map. Metoda main wygląda teraz tak:
Omińmy na razie dwie kolejne metody i przejdźmy do update.
Co ma się dziać tutaj? Jeśli przełącznik @appearing jest włączony, to wywołujemy metodę appear. To samo z @disappearing. Odświeżamy okienka oraz nasze tło. Ostatnią rzeczą jest zrobienie warunku na wciśnićcie klawisza ESC. Jeśli warunek zostanie spełniony, to odgrywamy dźwięk anulowania (cancel_se) oraz włączamy przełącznik odpowiadający za chowanie się okienek.
Pozostały nam dwie ostatnie, główne metody. Najpierw appear. Jak zrobić, by okno “wjeżdżało” na ekran? Wystarczy zmieniać jego pozycję w krótkich odstępach czasu. Na początku ustaliliśmy, że Window_Gold (tutaj @okno1) będzie miało współrzędne (200,100) oraz, że będzie się wsuwało od lewej strony. Wspłórzędna osi OY pozostaje bez zmian. Operować będziemy na OX. Tworzymy warunek: zwiększaj współrzędną x okienka pierwszego o 10px, jeśli ta współrzędna jest mniejsza od 200. To samo robimy z drugim okienkiem, tylko że w przeciwną stronę. Musimy dodać jeszcze jeden warunek, który sprawdzi czy oba okienka znajdują się już w swoich pozycjach. Jeśli tak, to przełącznik wyłączamy i metoda jest nieaktwyna.
Metoda disappear jest niemal identyczna. Z tym, że okienka poruszają się w drugą stronę. A jeśli osiągną daną współrzędną, to wywołujemy Scene_Map. Ot, to wszystko. Całość prezentuje się następująco:
Wypadałoby przetestować. Jeśli robiłeś wszystko tak, jakjest napisane - to nie powinno być żadnych kłopotów z działaniem skryptu.
Pozdrawiam!