Tytuł: Polecenie zdarzenia: obsługa klawiatury/przetwarzanie klawiszy
Opracował: Reptile
Email:
reptile@o2.pl
Cel eksperymentu
W wersji RPG2000 oraz RPG2003 istnieje polecenie zdarzenia obsługa klawiatury (stare tłumaczenie: przetwarzanie klawiszy).
Wraz z nowszymi wersjami owe polecenie zostało zmodyfikowane (RPGXP) lub usunięte (RPGVX i nowsze). Przy pomocy tego eksperymentu
postaramy się owe polecenie przywrócić. Podziękowanie dla Dragona Kamillo za podsunięcie jednego z możliwych rozwiązań.
~Reptile
Wpierw należy zrozumieć, do czego wymienione polecenie służyło. Każdy klawisz na klawiaturze posiada swoją wartość. Poprzez te polecenie - wartość wybranych klawiszy z klawiatury można zapisać do wskazanej zmiennej, a następnie oczywiście przy pomocy warunków można rozwijać swoje zamysły.
Najlepszym sposobem do zrozumienia tego polecenia jest omówienie go za pomocą przykładu. Zatem, interesują nas tylko przyciski kierunkowe (dół(1), lewo(2), prawo(3), góra(4) ). Kiedy gracz naciśnie dół, to zmienna zostanie ustawiona na wartość (1).
Następnie przy pomocy warunku, sprawdzamy wybraną zmienną ile ona wynosi (sprawdzamy jej wartość, bo chcemy wiedzieć jaki klawisz został naciśnięty). Dla zabawy, gdy warunek: zmienna jest równa 1, no to wyświetl wiadomość: naciśnięto dół.
Osoby, które używają nowszych wersji programu mogą skojarzyć opcję warunku -
ustaw warunek, przycisk [dół] został naciśnięty.
I w sumie dobrze, gdyż właśnie polecenie obsługa klawiatury w nowszych wersjach programu wyrzucona(!) i została wprowadzona do warunku.
:: PROBLEM ::
Jakie są różnice, w czym jest problem?
Pierwsza różnica: zasięg klawiszy. RPG2000 jak i RPG2003 oferowały więcej przycisków.
Druga różnica (ważniejsza): polecenie domyślnie czeka, aż przycisk zostanie naciśnięty przez gracza, natomiast w nowszych wersjach, jak to warunek działa - program sprawdza:
jest naciśnięty dół? Nie jest? OK, idziemy dalej.
Obsługa klawiatury to podstawowe polecenie podczas tworzenia wszelkiego rodzaju systemu menu, czy zaawansowanych funkcji (tak, wiem, rozumiem, można to zrobić wszystko przy pomocy skryptów - ruby czy javascript - ale tego nie uznaje, gdyż użytkownik tej opcji nie ma na tacy wyłożonej i koniec).
:: ROZWIĄZANIE PROBLEMU ::
Trzymajmy się może naszego prostego przykładu, zagadujemy do zdarzenia, a ono mówi nam jaki klawisz został wciśnięty. Problem rozwiązać można na kilka sposobów, jednak po naradzie z Dragon Kamillo, okazuje się, że sposób na etykiety będzie najefektowniejszym rozwiązaniem.
Do tego przyda się idealnie jedno typowe zdarzenie, które będzie ustawione na typowe/do wywołania. Nazwa zdarzenia może być
ob-klawiatury. Polecenia dla tego zdarzenia wyglądają następująco:
Najpierw ustaw
Etykietę i nazwij ją np.
Start. Pod poleceniem etykiety będziemy wrzucali warunki, które sprawdzają naciśnięty
klawisz oraz koniecznie należy zaznaczyć, inne zdarzenie jeżeli warunek się nie spełni. Jeżeli warunek jest spełniony to
niech naszą zmienną ustawi na konkretną wartość. Tym sposobem tworzymy szereg warunków, w warunku.
Łatwo można zauważyć, że warunek sprawdza:
klawisz został naciśnięty? Tak? To zmień zmienną na [wartość] i zakończ.
Nie? No to kolejny warunek, program sprawdza kolejny klawisz, czy został naciśnięty. Ten klawisz został naciśnięty? Tak? To zmień zmienną na [wartość] i zakończ.
Nie? No to kolejny warunek... aż przejdzie wszystkie podane klawisze. Przy ostatnim klawiszy w
inne zdarzenie (czyli jeżeli ten przycisk nie został naciśnięty) program ma
POWRÓCIĆ do momentu START, czyli na sam początek i ma za zadanie sprawdzać który przycisk zostanie naciśnięty przez gracza.
WAŻNE! Tutaj należy dać polecenie
Czekaj:1 w przeciwnym wypadku, program stworzy pętle, która zawiesi grę.
Wartość zmiennych ustawiacie w taki sposób by było wam wygodnie. Ja wartości zapożyczyłem z klawiatury numerycznej (wystarczy na nią spojrzeć - 2: dół, 4: lewo, 8: góra, 6:prawo).
Skoro mamy typowe zdarzenie obsługa klawiatury, to czas je wytestować.
Jak to nasze polecenie można użyć? Wystarczy, że najpierw wprowadzimy polecenie
Czekaj:10 (by program miał szansę na wyczyszczenie wiadomości i krótkie przygotowanie dla gracza), a następnie polecenie zdarzenia
Wywołaj typowe zdarzenie i dać nasze
ob-klawiatury, i już działa!
Wiadomość: Hej, testuje obsługę klawiatury.
Czekaj: 10
Typowe zdarzenie: ob-klawiatury
Wiadomość: Wartość twojego naciśniętego klawisza wynosi: \v[numer zmiennej],
Pod każdym warunkiem należy użyć następnego warunku dla kolejnego klawisza, niestety
ale należy utworzyć warunki dla każdego klawisza, jaki został wprowadzony w
typowym zdarzeniu (na początku).
:: REZULTAT ::
Sprawa z pętlą za pomocą etykiet sprawdza się w VX/VXAce/MV i ta metoda w jakiś sposób odwzorowuje polecenie
obsługa klawiatury, które zostało usunięte. Pomysł z etykietami okazał się strzałem w dziesiątkę. Z innych rozwiązań, które można było zastosować to:
- Rozwiązanie #1
Typowe zdarzenie to auto start uruchomione za pomocą przełącznika, a w poleceniach byłyby same warunki sprawdzające naciśnięcie klawisza.
Np. Warunek [dół] naciśnięty, no to zmień zmienną [numer] ustaw na 2 i daj przełącznik OFF (by wyłączyć to typowe zdarzenia auto start). Metoda działa na VXAce/MV ale niestety nie daje rady przy VX.
- Rozwiązanie #2
Zamiast zdarzenia autostart, ustawić typowe zdarzenie jako równoległe. W ten sposób owe zdarzenie zadziała, ale nie będzie funkcjonować, tak jak powinno. Czyli wciśnięte klawisze nie zawsze zareagują za pierwszym razem i to może być irytujące.
- Rozwiązanie #3
Szukać owego polecenia w postaci skryptu (ruby/javascript) gdzieś po zakątkach internetu, bądź samemu coś takiego napisać. Podałem ten argument wyżej, że go nie uznaje /dlaczego?/ ponieważ polecenie te powinno być dostępne dla użytkownika - na tacy do użycia i już. Argument typu możesz sobie skrypt napisać jest idiotyczny, gdyż użytkownik musi specjalnie nauczyć się programować w konkretnym języku (ruby/javascript). Idąc tym tokiem myślenia, można równie dobrze rzucić program rpg maker i robić grę na innym silniku, który przyniesie więcej korzyści dla twórcy, tylko chyba nie o to w tym chodzi, prawda?
Nie mniej, jeżeli kiedyś w internecie wyhaczę owy skrypt, to z pewnością tutaj w tym miejscu też go zamieszczę (ale nie odpowiadam za jego działanie).