Autoscroll – automatyczne przewijanie

Pośród wielu zagadnień związanych z własnymi systemami, których zaledwie część omawiam przy okazji kursu tworzenia CMS-a na obrazkach, jednymi z ciekawszych są kwestie nawigacji. A już do zupełnej czołówki należą sprawy związane z autoscrollowaniem czyli sytuacją, w której przytrzymując przycisk sprawiamy, że kursor zaczynam sam przeskakiwać o kolejne pozycje w naszym systemie.

Jakiś czas temu natrafiłem na zarchiwizowany poradnik użytkownika Vanit z legendarnego forum Gaming World. W prosty, choć może nieco nieprzystępny sposób zaprezentował on, jak szybko i skutecznie zaimplementować automatyczne przewijanie do dowolnego CMS-a. Niniejsza lekcja jest przełożeniem jego pomysłu na współczesne realia i nie roszczę sobie żadnych praw do autorstwa omawianego pomysłu.

Założenia

Sposób zaprezentowany przez Vanita jest o tyle lepszy od wielu innych autoscrolli, które pojawiały się w grach z RM, że spełnia rygorystyczne założenia wzięte z gier wysokobudżetowych:

  1. przewijanie reaguje na zachowanie gracza niezależnie od momentu, w jakim się znajduje;
  2. automatyczne przewijanie zaczyna się tylko wtedy, gdy klawisz przytrzymywany jest przez około sekundę;
  3. podczas przytrzymywania klawisza gracz może zmienić zdanie w każdej chwili i zmienić kierunek przewijania;
  4. przerwanie automatycznego przewijania resetuje je, nawet gdy chcemy dalej przewijać w tym samym kierunku.

Cały skrypt operujący autoscrollowaniem będzie się znajdował w jednym Common Evencie z Triggerem ustawionym na None. Na początek całość kodu:

Jak widać, liczba komend jest dość krótka, ale logika tego rozwiązania wymaga wnikliwego i szerszego omówienia.

Założenie 1 – Przewijanie reaguje na zachowanie gracza niezależnie od momentu, w jakim się znajduje

Podstawowym założeniem autoprzewijania jest umiejętność „wyczucia” gracza, który nawiguje po menu. W tym celu musimy sprawić, by skrypt zaczął automatyczne przewijanie dopiero po jakimś okresie czasu – jeśli zrobi to za szybko, nawigacja może okazać się uciążliwa. Kwestia ta załatwiana jest prosty przełącznikiem.

Nasz skrypt zaczynamy od ustawienia przełącznika Petla Czekaj na ON, a następnie wstawiamy pętlę. Wewnątrz pętli sprawdzamy, czy przełącznik jest włączony. Jeśli tak, wstawiamy trzy komendy wait (0.1, 0.0 i 0.0 – pamiętajcie, że 0.0 to nie jest tak naprawdę 0, ale trochę więcej!) i wyłączamy przełącznik. Jeśli natomiast warunek nie jest spełniony, wstawiamy po prostu jedno Wait z 0.0.

Co w zasadzie tutaj zrobiliśmy? Dzięki przełącznikowi sprawdzamy, czy rozpoczynamy pętlę po raz pierwszy. Jeśli tak, dajemy programowi trochę więcej czasu do namysłu.

Założenie 2 – Automatyczne przewijanie zaczyna się tylko wtedy, gdy klawisz przytrzymywany jest przez około sekundę

Jak słusznie wskazuje autor tej koncepcji, autoscrollowanie jest liniowe, dlatego trzeba ustalić, czy podczas danego sprawdzania pętli wciśnięty jest ten sam klawisz, jak podczas poprzedniego. Wczytanie klawisza do zmiennej zawsze usuwa poprzednią wartość, dlatego przed rozpoczęciem pętli musimy przechować ją w dodatkowej zmiennej. Dlatego na samym początku skryptu zmiennej 0001:Poprzednia pętla przypisujemy wartość zmiennej 0002:Klawisze (do tej ostatniej będziemy przypisywać wartość wciśniętych przycisków).

Pierwsze, co nasuwa się w tej sytuacji, to wrzucenie jakiegoś dłuższego Waita po sprawdzeniu, że gracz wcisnął ten sam przycisk, co poprzednio, ale to mylna droga. Program musi sprawdzać, czy przez określony czas gracz cały czas wciska ten przycisk, a nie wciska go tylko raz.

Dlatego po warunku z naszym przełącznikiem wstawiamy przechwytywanie klawiszy do wcześniej przygotowanej zmiennej 0002 (opcja Wait for Key Input ma być odznaczona!). Teraz wstawiamy warunek sprawdzający, czy zmienna z klawiszem nie jest równa zero (tzn. czy w ogóle jakiś przycisk jest wciśnięty). Wewnątrz tworzymy kolejny warunek sprawdzający, czy zmienna Poprzednia Petla jest równa zmiennej Klawisze. Jeśli tak, zwiększamy nową zmienną 0003:Licznik Petli o 1, a następnie wstawiamy trzeci już warunek i sprawdzamy, czy Licznik Petli jest równa 14 lub więcej – jeśli tak, kończymy pętlę komendą Break Loop.

Powyższe rozwiązanie sprawia, że program sprawdza, kiedy gracz faktycznie przytrzymuje klawisz przez określony czas.

Założenie 3 – Podczas przytrzymywania klawisza gracz może zmienić zdanie w każdej chwili i zmienić kierunek przewijania

Trzecie istotne założenie związane jest z tym, co gracz może zrobić w trakcie automatycznego przewijania. Załatwia się to bardzo prosto. W drugim warunku omówionym wcześniej (porównanie Poprzedniej Petli i Klawiszy) dodajemy opcję ELSE, w której zerujemy zmienną Loop Counter i łamiemy pętlę.

Co w zasadzie zrobiliśmy? Sprawiliśmy, że jeśli gracz wciśnie inny przycisk niż ten, który przytrzymywał wcześniej, autoscrollowanie zostaje wyłączone.

Założenie 4 – Przerwanie automatycznego przewijania resetuje je, nawet gdy chcemy dalej przewijać w tym samym kierunku

Ostatnie założenie wydaje się proste w teorii, ale trudne do zrozumienia w praktyce. Żeby je zastosować musimy dodać opcję ELSE do pierwszego omawianego wcześniej warunku, czyli sprawdzenia, czy zmienna 0002:Klawisze nie jest równa 0. Wewnątrz ELSE zmienną 0001:Poprzednia Petla ustawiamy na -1 (minus jeden). To już cały skrypt autoscrollowania, który zaprezentowałem na samym początku:

Dzięki opcji ELSE w tym miejscu możemy zareagować, gdy żaden klawisz nie jest wciśnięty (czyli gdy gracz przerwał autoscrollowanie). Czemu akurat minus 1? Ponieważ żaden wciśnięty klawisz nie daje takiej wartości, a zatem gdy kolejny raz pętla wróci do warunku porównującego zmienne 0001 i 0002, zgodnie z komendami z opcji ELSE zostanie zakończona.

Zastosowanie skryptu w praktyce

Autor tego rozwiązania nie wskazał wprost, jak należy zastosować je w swoim systemie, ale to dość prosta sprawa. By przetestować program tworzymy na mapie 8 zdarzeń, w warunku każdego z nich wskazując zmienną 0004:Pozycja i jej wartość od 1 do 8. Dzięki temu będziemy widzieć, gdzie znajduje się nasz „kursor”.

Następnie tworzymy drugi po autoscrollu common event (tym razem ustawiony na autostart) i implementujemy tam prostą nawigację – przechwytujemy klawisze do zmiennej 0002, wywołujemy przygotowany wcześniej przez nas event z automatycznym przewijaniem, a następnie w zależności od miejsca kursora na mapie, odpowiednio zmieniamy wartość zmiennej odpowiadającej za jego pozycję.

By otrzymać jednoznaczne wyniki, ja jeszcze na mapie automatycznie ustawiłem początkową wartość zmiennej Pozycja na 1.

Gotowe! Teraz gdy odpalisz projekt, będziesz mógł przewijać w górę i w dół pojedynczymi kliknięciami lub autoscrollem. Oczywiście, gdyby w nawigacji dorobić jeszcze warunki dla strzałek w bok, automatyczne przewijanie działałoby również w lewo i prawo.

Michał „Michu” Wysocki

– Download przykładowego projektu –

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.