Własny system wyników online

Klikipedia - klikowa encyklopedia
Skocz do: nawigacji, wyszukiwarki
Slimaczek.jpg
Pierwotna wersja tego artykułu pochodzi z 6. numeru Ślimaczka (zobacz oryginalny artykuł).


Autor.jpg
Autorem tego artykułu jest
sulge

Ostatnio kolega zetcom przedstawił wam drodzy czytelnicy przykładowe zastosowanie obiektu "NOBU Http" do downloadu plików z Internetu. Proponuję Wam zapoznanie się z inną ciekawą możliwością tego obiektu, a mianowicie z możliwością wysyłania przez niego rekordów online. Sposób wysyłania wyników, będzie podobny do systemu wysyłania wyników na portalu Slawa Zagrajmy, z tą jednak zasadniczą różnicą, że tam system działał w oparciu o komercyjne (czyt. nie darmowe) rozszerzenie MooSock. Obydwa pluginy działają podobnie i komunikują się z serwerem przez port "80", więc jeżeli nie mogliście wysyłać wyników na portal "Zagrajmy" w tym systemie też to nie będzie możliwe. Oczywiście są inne sposoby, na wysyłanie wyników jak choćby system oparty o obiekt FTP komunikujący się z serwerem przez port "21", który nie może być zablokowany przez dostawcę usług internetowych (system ten wykorzystany został w grze "Daję Słowo 2", może, jeżeli pepe9donkey pozwoli zaprezentuję go w kolejnym numerze "Ślimaczka"), ale żaden z nich nie jest tak bezpieczny, funkcjonalny i niezawodny.

Postaram się w sposób jasny i szczegółowy opisać jak działa ten system, jednak wcześniej dla klikowców orientujących się w problematyce języka PHP wyjaśnię w sposób bardzo szybki działanie systemu.

Wstęp

Cały system opiera się o obiekt Nobu HTTP, który potrafi tak samo jak przeglądarka zgłosić żądanie strony o danym adresie do serwera, a jeśli chodzi o stronkę napisaną w PHP, spowodować jej przetworzenie przez interpreter. Służy do tego akcja "URL Download", której jako parametry podajemy adres strony np. http://rekordy.pl/index.php?z=12, oraz ścieżkę do pliku, gdzie zostanie zapisany kod strony pobrany po interpretacji. Jak wiecie wywołanie strony z taką oto końcówką: "?z=12" powoduje, że przy interpretowaniu kodu strony w tablicy $HTTP_GET_VARS pod indeksem "z", będzie dostępna wartość 12. Ta metoda przesyłania wartości zmiennych nazwana jest metodą GET, jest to metoda bezpośrednia przesyłająca wartość zmiennej przez adres http. Nobu HTTP pozwala, także na przesyłanie wartości zmiennych metodą POST służy do tego akcja "Set POST Data>>Set Param", której jako argumenty podajemy nazwę zmiennej i jej wartość, a następnie wywołujemy stronę przez akcję URL Download. Tak zadane wartości zmiennych będą widoczne w interpreterze PHP w tablicy $HTTP_POST_VARS. Myślę, że takie informację w pełni wystarczą tym, którzy już kiedyś na poważnie bawili się z językiem PHP, no i oczywiście z klikami, aby stworzyć swój własny system online. Oczywiście tak samo jest z językiem ASP i skryptami CGI.

Zdaję sobie sprawę, że dla osób niezajmujących się tworzeniem dynamicznych stron WWW, poprzedni akapit to jakieś brednie. Nie starajcie się, więc go na razie zrozumieć, a przejdźcie do dalszej części kursu. Na pewno po przeczytaniu całości w mniejszej bądź większej części zrozumiecie również pierwszy akapit.

Stworzenie konta z obsługą PHP i MySQL

Do stworzenia systemu online, który będzie wysyłał wyniki z gry na stronę potrzebujemy kilku rzeczy:

pobieramy je ze strony http://www.clickteam.info/extensions/

  • no i oczywiście samego MMF

Na początku zajmiemy się zorganizowaniem serwera WWW. Proponuję darmowy hosting http://www.yoyo.pl. Poniżej opiszę krok po kroku jak założyć u nich konto:

  1. Wejdź na stronkę: http://www.yoyo.pl/create i wypełnij pola formularza
  2. Sprawdź swoją skrzynkę email i przeczytaj uważnie emaila: "Portal YoYo.pl - Rejestracja" zawarte są w nim dane do twojego konta www.
  3. Zaloguj się na portalu YOYO i utwórz nową stronę, na której umieścisz pliki odpowiedzialne za dodawanie rekordów z naszej gry do bazy danych.
  4. Następnie dodaj nową bazę MySQL, która będzie przechowywać rekordy z Twojej gry.
  5. Kiedy Twoja stronka uzyska status "Aktywna" (będzie to ok. 5 min po jej utworzeniu), będziesz mógł przesłać na nią pliki skryptu. Zanim to jednak uczynisz musisz pozmieniać parę rzeczy w jednym z plików skryptu "dane.php". Edytuj ten plik w zwykłym notatniku i zmień w nim:
    • hasło skryptu 'alojzykleks' na jakieś własne, które potem użyjesz również w programie gry, hasło to weryfikuje, czy rekordy wysyła osoba upoważniona do tego.
    • adres serwera bazy danych 'localhost' na adres uzyskany w czasie tworzenia nowej bazy.
    • nazwę bazy danych 'wyniki' na nazwę własnej bazy danych
    • hasło do bazy danych 'krasnal' na hasło podane w czasie tworzenia bazy
    • login do bazy 'root' na własny login
    • ilość rekordów domyślnie 100 na liczbę rekordów, jaką chcesz, aby była pamiętana w Twojej bazie.
      Po prawidłowej zmianie danych zapisz plik "dane.php" i prześlij wszystkie pliki skryptu na serwer. Możesz to zrobić np. za pomocą programu Total Commander, ale nic nie stoi na przeszkodzie, aby w tym celu wykorzystać przeglądarkę stron www. W przeglądarce więc (ja użyłem Internet Explorer'a) wpisz taki oto adres: ftp://xxxxxxx.yoyo.pl/, gdzie "xxxxxx" to nazwa strony i kliknij enter. Powinno pojawić się nowe okienko. W pole "Nazwa użytkownika" wpisz "xxxxxxxxx.yoyo.pl" natomiast w pole "Hasło" wpisz swoje hasło (nie chodzi tu o hasło do zalogowania na serwerze, a o hasło podane w czasie zakładania strony, chyba że obydwa masz takie same). Po zalogowaniu prześlij pliki skryptu (zawarte w folderze skrypt) na serwer przeciągając je na okno przeglądarki.
  6. Jeszcze tylko musisz uruchomić plik instalacyjny, który utworzy odpowiednie tabele w Twojej bazie danych. Wpisz adres: http://xxxxxxx.yoyo.pl/instal.php i kliknij enter. Powinieneś zobaczyć komunikat "Tabela utworzona poprawnie".

Teraz nasza strona jest już przygotowana na odbieranie wyników z naszej gry.

Wysyłanie wyników

Przejdźmy teraz do utworzenia odpowiedniego systemu online w MMF. Cały system podzielimy na dwie części (dwa poziomy). Pierwsza odpowiedzialna będzie za wysłanie wyniku na stronę, a druga za pobranie wyników ze strony i wyświetlenie ich w tabeli.

Zajmijmy się najpierw częścią wysyłającą wyniki.

Utwórzmy nowy poziom wysyłanie wyników i edytujmy go wstawiając niezbędne obiekty. NOBU Http odpowiedzialny za wysłanie rekordów na stronkę; dwa obiekty edycji nazwane pseudo i wynik, do których wpiszemy nasz wynik i pseudonim; dwa standardowe przyciski, kliknięcie przycisku "Button" spowoduje wysłanie wyniku, natomiast kliknięcie przycisku Button 2 - przejście do poziomu z tabelą rekordów; jeden obiekt String, który będzie wyświetlał komunikaty odnośnie powodzenia bądź niepowodzenia wysłania wyniku.

Nasz poziom powinien wyglądać następująco:

wyniki13.gif

Teraz możemy przejść do edytora zdarzeń.

Będziesz potrzebował:

  • EZ-edit.png pseudo
  • EZ-edit.png wynik
  • EZ-nobu.png NOBU Http
  • EZ-button.png Button
  • EZ-button.png Button 2
  • EZ-string.png String

W pierwszym zdarzeniu nałożymy pewne ograniczenia na obiekty edycji. Ustawimy maksymalną długość tekstu w obiekcie "pseudo" na 20, a długość rekordu maksymalnie na 10 cyfr. Wyczyścimy także obiekt "String", na początku nie powinien bowiem zawierać żadnego komunikatu.

Wysyłanie wyników
N Zdarzenia
1
+ EZ-special.png Run this event once
EZ-edit.png pseudo: Limit text size to 20
EZ-edit.png wynik: Limit text size to 10
EZ-string.png String: Set alterable string to ""

Po naciśnięciu przycisku "Button 2" nasza gra przechodzi do 2 poziomu.

2
+ EZ-button.png Button 2 clicked
EZ-frames.png jump to frame number 2

Po naciśnięciu przycisku "Button" aktywowana zostanie grupa "spr", w której będą zawarte warunki sprawdzające, czy gracz wpisał imię, czy wynik mieści się w zakresie. Oraz sama akcja wysyłająca rekord. Na czas wysyłania rekordów dezaktywujemy "Button".

3
+ EZ-button.png Button clicked
EZ-button.png Button disable
EZ-special.png Activate group "spr"

Pozostała część akcji będzie mieścić się w grupie "Spr". Utwórzmy, zatem tą grupę, która jest dezaktywowana w czasie startu poziomu.

Pierwsza akcja w grupie "spr" będzie sprawdzać, czy gracz wpisał imię, czyli czy tekst w obiekcie edycji jest różny od "". Jeśli warunek ten zostanie spełniony to grupa "spr" zostanie aktywowana, przycisk "Button" zostanie aktywowany, a w obiekcie "String" wyświetlony zostanie komunikat, że gracz musi wpisać imię.

N Zdarzenia
4
+ EZ-edit.png Edittext$("pseudo”) = ""
EZ-special.png Deactivate group "spr"
EZ-button.png Enable
EZ-string.png String: Set alterable string to "Musisz wpisać imię!!!"

Kolejna akcja sprawdzi, czy wynik nie przekroczył górnego zakresu 2147480000, bowiem wyniki w naszej bazie danych są typu, Longint, czyli z zakresu -2147483648.. 2147483647 i większy wynik nie byłby poprawnie zapisany. Jeśli warunek ten zostanie spełniony to grupa "spr" zostanie aktywowana, przycisk "Button" zostanie aktywowany, a w obiekcie "String" wyświetlony zostanie komunikat, że "Wynik nie może przekraczać 2147480000 punktów!!!".

5
+ EZ-edit.png Val(Edittext$( "wynik”)) > 2147480000
EZ-special.png Deactivate group "spr"
EZ-button.png Enable
EZ-string.png String: Set alterable string to "Wynik nie może przekraczać 2147480000 punktów!!!"

Sprawdźmy jeszcze, czy jest sens wysyłać wynik, czyli czy jest większy od 0.

6
+ EZ-edit.png Val(Edittext$( "wynik”)) <=0
EZ-special.png Deactivate group "spr"
EZ-button.png Enable
EZ-string.png String: Set alterable string to "Nie można dodać rekordu z wynikiem 0 lub niższym"

Kiedy żaden z tych warunków nie zostanie spełniony będziemy mogli wysłać nasz wynik na serwer. Zrobimy to za pomocą akcji "URL Download". Będziemy download’ować adres naszej strony z jednoczesnym nadaniem odpowiednich wartości zmiennym "autor", "wynik", "haslo". Wartość zmiennej "autor" ustawimy na tekst pobrany z obiektu edycji "pseudo", wartość zmiennej "wynik" na tekst pobrany z obiektu edycji "wynik", oraz wartość zmiennej "haslo" na taki sam tekst, jaki zmieniliśmy w pliku "dane.php". Ostatecznie adres strony do w wywołania będzie wyglądał następująco:

http://xxxxx.yoyo.pl/dodaj.php?id=" + Str$( Global Value A ) + "&autor=" + Edittext$( "pseudo" ) + "&wynik=" + Edittext$( "wynik" ) + "&haslo=alojzykleks"

Obecność zmiennej globalnej A wyjaśnię w dalszej części artykułu. Drugi parametr akcji "URL Download" może zostać pusty, gdyż kod pobranej strony będzie krótki (będzie to komunikat typu: "Udało się dodać rekord!!!", bądź "Wystąpiły błędy przy dodawaniu rekordu") i w zupełności zmieści się do bufora obiektu "NOBU Http". Dodamy jeszcze do wartości globalnej A jeden, aby przy kolejnym wysyłaniu rekordu adres strony różnił się.

7
+ EZ-special.png Only one action when event loops
EZ-nobu.png URL-"http://xxxxx.yoyo.pl/dodaj.php?id=" + Str$( Global Value A ) + "&autor=" + Edittext$( "pseudo" ) + "&wynik=" + Edittext$( "wynik" ) + "&haslo=alojzykleks"
EZ-special.png Add 1 to Global Value A

Kiedy w czasie wysyłania wyników obiekt "NOBU Http" zwróci jakiś błąd, oznaczać to będzie, że wynik nie zostanie poprawnie wysłany. Należy poinformować o tym gracza i przerwać dalsze jego wysyłanie.

7
+ EZ-nobu.png On error
EZ-string.png Set alterable string to "Nastapiły problemy z wysłaniem rekordu!!!"
EZ-nobu.png Download Cancel
EZ-special.png Deactivate group "spr"
EZ-button.png Enable

Kiedy natomiast akcja wysyłania wyników zostanie zakończona pomyślnie również musimy poinformować o tym gracza i dezaktywować grupę "spr".

8
+ EZ-nobu.png Download complete
EZ-string.png Set alterable string to downfile$( "NOBU Http" )
EZ-special.png Deactivate group "spr"
EZ-button.png Enable

To już koniec poziomu wysyłania wyników.

Tabela wyników

Teraz zajmijmy się poziomem z tabelą rekordów online. Najpierw przejdźmy do edycji poziomu i powstawiajmy niezbędne elementy. Oczywiście niezbędnym obiektem będzie NOBU Http dzięki niemu wywołamy stronę skryptu, który zwróci nam nasze rekordy w postaci ciągu znaków. Kolejnym niezbędnym elementem będzie String Parser 2, przy pomocy, którego podzielimy zwrócony ciąg na rekordy. Musimy jeszcze w jakiś sposób zaprezentować nasze rekordy tak, aby gracz mógł je przejrzeć. Posłużymy się w tym celu 5 obiektami "Edit object". Aby ułatwić analizę kodu nazwijmy je odpowiednio "miejsce", "pseudo", "wynik", "data" i "czas". Teraz edytujmy każdy z obiektów ustawiając następujące ich właściwości:

image013.png

Oki. Jeszcze tylko wstawmy kilka pomocniczych obiektów:

  • EZ-counter.png dwa liczniki, jeden nazwijmy "przewin", a drugi "bufor",
  • EZ-button.png dwa standardowe przyciski,
  • EZ-string.png jeden obiekt "String".

Edytujemy tekst obiektu "String" wstawiając do niego znak nowej linii (po prostu usuwamy cały tekst i klikamy enter, kursor przeskoczy do nowej linii i właśnie oto nam chodziło, zatwierdzamy) Po tych wszystkich zabiegach nasz poziom powinien wyglądać następująco:

wyniki12.gif

Teraz możemy przejść do edytora zdarzeń.

Potrzeben obiekty:

  • EZ-edit.png miejsce
  • EZ-edit.png pseudo
  • EZ-edit.png wynik
  • EZ-edit.png data
  • EZ-edit.png czas
  • EZ-stringparser.png String Parser 2
  • EZ-counter.png przewin
  • EZ-counter.png bufor
  • EZ-nobu.png NOBU Http
  • EZ-button.png Button
  • EZ-button.png Button 2
  • EZ-string.png String

W pierwszym zdarzeniu wczytamy do obiektów edycji odpowiednie pliki, które jeszcze nie istnieją, później będą przechowywać rekordy: plik "miejsce.txt" – miejsca, jakie zajmują wyniki gracza na liście, plik "pseudo.txt" – pseudonimy graczy, plik "wynik.txt" - wyniki, plik "data.txt" – daty dodania rekordów, plik "czas.txt" – czasy dodania rekordów. Oraz ustawimy wartość minimalną licznika "przewin" na 0, a maksymalną wartość tegoż licznika na wyrażenie EditLineCount( "pseudo") – 15, gdzie EditLineCount( "pseudo") to ilość linii w jednym z obiektów edycji, (czyli ilość rekordów), a 15 to liczba rekordów wyświetlana w polu edycji widoczna bez przewijania. Licznik ten będzie przechowywał numer pierwszej widocznej linii przewijanego tekstu w obiektach edycji. Ustawimy także "default delimiter", czyli po polsku standardowy rozdzielacz. Po tym krótkim wyjaśnieniu oto ta 1 linijka kodu:

Zdarzenia do tabelki wyników
N Zdarzenia
1
+ EZ-special.png Run this event once
EZ-edit.png Miejsce: Load text file- Appdrive$ + Appdir$ + "miejsce.txt"
EZ-edit.png pseudo: Load text file- Appdrive$ + Appdir$ + "pseudo.txt"
EZ-edit.png wynik: Load text file- Appdrive$ + Appdir$ + "wynik.txt"
EZ-edit.png data: Load text file- Appdrive$ + Appdir$ + "data.txt"
EZ-edit.png czas: Load text file- Appdrive$ + Appdir$ + "czas.txt"
EZ-counter.png przewin: Set minimum value to 0
EZ-stringparser.png: Set default delimiter to "|-|"
EZ-counter.png przewin: Set maximum value to EditLineCount( "pseudo" ) - 15
EZ-stringparser.png: Set default delimiter to "|-|"

Teraz czas na drugą linijkę kodu. Standardowy przycisk "Button", będzie odpowiedzialny za uruchomienie akcji pobierającej z naszej strony rekordy. Obiekt "NOBU Http" zwróci się do serwera z żądaniem strony o adresie: http://xxxxx.yoyo.pl/zwroc.php?id=" + Str$(Global Value A), gdzie xxxxx- to nazwa naszej strony, a otrzymany wynik zapisze w pliku "temp.txt". Należy zauważyć, że w adresie użyta została także zmienna globalna A, która jest wartością parametru id. i po kliknięciu licznika zwiększa się o 1. Taki zabieg jest niezbędny, aby, przy każdym wywołaniu adres różnił się, a to dlatego, że przy powtórnym wykonaniu tej samej akcji "NOBU Http" nie zwróciłby się do serwera z żądaniem strony, a pobrałby ją z swojego bufora (a przecież w tym czasie ktoś mógłby dodać wynik i te odświeżone były by nieaktualne). Nie będę się zagłębiał w wyjaśnianie tego, powiem tylko, że jest to związane z optymalizacją.

2
+ EZ-button.png Button clicked
EZ-nobu.png URL Download- "http://xxxxx.yoyo.pl/zwroc.php?id=" + Str$( Global Value A )=> Appdrive$ + Appdir$ + "temp.txt"
EZ-special.png Add 1 to Global Value A

Wszystkie nasze rekordy, a właściwie kod żądanej strony, po takiej akcji zostanie zapisany do pliku "temp.txt" znajdującym się w katalogu gry. Możemy go podejrzeć jego struktura będzie następująca:

1.|-|Łukasz19 Kozek19|-|77012|-|2006-05-12|-|15:57:54|-|2.|-|Adam Małysz|-|76001|-|2006-03-11|-|24:00:00|-| itd.

Ogólnie będzie to wyglądać tak:

miejsce.|-|pseudo|-|wynik|-|data|-|godzina|-| miejsce.|-|pseudo|-|wynik|-|data|-|godzina|-| itd.

Po pobraniu wyników do pliku należy wczytać je do obiektu "String Parser 2", a następnie odpowiednio porozdzielać poszczególne pola rekordów do odpowiednich obiektów edycji zanim to jednak nastąpi należy wyczyścić wszystkie pola edycji, aby nie zawierały żadnego tekstu. Kiedy już wczytamy rekordy do "String Parser 2" ustawimy maksymalną wartość licznika "przewin" (odpowiedzialnego za przewijanie rekordów) na ilość linii w jednym polu edycji, czyli na liczbę rekordów pomniejszoną o ilość rekordów widzianych bez przewijania (nie chcemy bowiem doprowadzić do sytuacji, że w skrajnym przypadku nie będzie widoczny żaden rekord). Wiedząc, że każdy rekord ma 5 pól i każde pole rozdzielone jest przez "|-|", a w moim przypadku bez przewijania widocznych jest 15 rekordów, wystarczy obliczyć wyrażenie listCount("String Parser 2") / 5-15, gdzie listCount("String Parser 2") to ilość wszystkich elementów wczytanych z pliku "temp.txt" rozdzielonych "|-|". Oczywiście po odświeżeniu pola edycji powinny być przewinięte na 1 linijkę, dlatego ustawiamy wartość licznika "przewin" na 0. I w końcu wywołujemy naszą pętlę "z", tyle razy ile jest rekordów, czyli listCount("String Parser 2") / 5.

3
+ EZ-nobu.png Download complete
EZ-nobu.png URL Download- "http://xxxxx.yoyo.pl/zwroc.php?id=" + Str$( Global Value A )=> Appdrive$ + Appdir$ + "temp.txt"
EZ-edit.png miejsce: Set text ""
EZ-edit.png pseudo: Set text ""
EZ-edit.png wynik: Set text ""
EZ-edit.png data: Set text ""
EZ-edit.png czas: Set text ""
EZ-stringparser.png Load from file- Appdrive$ + Appdir$ + "temp.txt"
EZ-counter.png przewin: Set maximum value to- listCount( "String Parser 2" ) / 5 – 15
EZ-counter.png przewin: Set counter to 0
EZ-special.png Start loop "z" listCount( "String Parser 2" ) / 5 times

Teraz zajmiemy się wywołaną w poprzednim zdarzeniu pętlą o nazwie "z". Pętla ta w każdym z kroków wstawia 1 rekord pobrany z obiektu "String Parser 2". Przypomnijmy sobie jeszcze jak wygląda format jednego rekordu: miejsce.|-|pseudo|-|wynik|-|data|-|godzina. U nas każde z pól rekordu zostanie wczytane do nowej linii odpowiedniego dla danego pola obiektu "edit". Miejsca w obiekcie "String Parser 2" mają indeksy 1, 6, 11, 16, 21… itd., czyli ogólnie numer aktualnie wczytywanego rekordu razy 5 odjąć 4; pseudonimy natomiast mają indeksy 2, 7, 12, 17, 22… itd., czyli ogólnie numer aktualnie wczytywanego rekordu razy 5 odjąć 3; wyniki 3, 8, 13, 18, 23…, ogólnie numer aktualnie wczytywanego rekordu razy 5 odjąć 2; daty indeksy 4, 9, 14, 19, 24…, ogólnie numer aktualnie wczytywanego rekordu razy 5 odjąć 1 i wreszcie czasy indeksy 5, 10, 15, 20, 25…, ogólnie numer aktualnie wczytywanego rekordu razy 5. Przejście do kolejnej linii zrealizujemy przez doklejenie po każdym z pól znaku nowej linii u nas będzie to znak "Entera" pobrany z obiektu "String".

4
+ EZ-special.png On loop "z"
EZ-edit.png miejsce: Set text - Edittext$( "miejsce" ) + listGetAt$( "String Parser 2", ( ( LoopIndex( "z" ) + 1 ) * 5 ) - 4 ) + string$( "String" )
EZ-edit.png pseudo: Set text - Edittext$( "pseudo" ) + listGetAt$( "String Parser 2", ( ( LoopIndex( "z" ) + 1 ) * 5 ) - 3 ) + string$( "String" )
EZ-edit.png wynik: Set text - Edittext$( "wynik" ) + listGetAt$( "String Parser 2", ( ( LoopIndex( "z" ) + 1 ) * 5 ) - 2 ) + string$( "String" )
EZ-edit.png data: Set text - Edittext$( "data" ) + listGetAt$( "String Parser 2", ( ( LoopIndex( "z" ) + 1 ) * 5 ) ) + string$( "String" )
EZ-edit.png czas: Set text - Edittext$( "czas" ) + listGetAt$( "String Parser 2", ( ( LoopIndex( "z" ) + 1 ) * 5 ) ) + string$( "String" )

Rekordy mamy już wczytane. Teraz jeszcze musimy zrobić akcje obsługujące przewijanie rekordów, tak, aby gracz mógłby je obejrzeć wszystkie (trudno zastosować na tyle duży obiekt edycji, aby wyświetlić bez przewijania np. 100 linii). Numer pierwszej widocznej linii będziemy przechowywać jako wartość licznika "przewin". Więc aby przewinąć rekordy o 1 linię do góry lub o jedną w dół wystarczy dodać bądź odjąć od licznika "przewin" 1 i przewinąć tekst wszystkich obiektów aktywnych do linii, której numer przechowywany jest w tym liczniku. Dzięki temu, że wartość maksymalną licznika ustawiliśmy na ilość rekordów, a wartość minimalną na 0 (linie w obiekcie aktywnym są numerowane od 0) nie ma problemu z przekroczeniem zakresu, czyli przewinięciem do linii, której nie ma. Sama akcja dodająca do licznika "przewin" nie jest ważna. Pójdźmy po najmniejszej linii oporu i wykorzystajmy w tym celu klawisze kursorów. Po naciśnięciu klawisza "strzałka w górę" będziemy odejmować od licznika "przewin" 1, a po naciśnięciu klawisza "strzałka w dół" dodawać 1.

5
+ EZ-keyboard.png Uppon pressing "down arrow"
EZ-counter.png przewin: Add 1 to counter
EZ-edit.png miejsce: Scroll to line – value(„przewin”)
EZ-edit.png pseudo: Scroll to line – value(„przewin”)
EZ-edit.png wynik: Scroll to line – value(„przewin”)
EZ-edit.png data: Scroll to line – value(„przewin”)
EZ-edit.png czas: Scroll to line – value(„przewin”)
EZ-counter.png bufor: Set Counter to 0
6
+ EZ-keyboard.png Uppon pressing "up arrow"
EZ-counter.png przewin: Subtract 1 from counter
EZ-edit.png miejsce: Scroll to line – value(„przewin”)
EZ-edit.png pseudo: Scroll to line – value(„przewin”)
EZ-edit.png wynik: Scroll to line – value(„przewin”)
EZ-edit.png data: Scroll to line – value(„przewin”)
EZ-edit.png czas: Scroll to line – value(„przewin”)
EZ-counter.png bufor: Set Counter to 0

Tak właściwie mogłoby już zostać jednak przesunięcie tekstu o np. 50 linii było by bardzo uciążliwe, wymagałoby, bowiem 50-cio krotnego naciśnięcia klawisza. Gdybyśmy, zaś zastąpili akcję "po naciśnięciu klawisza..." na "powtarzaj dopóki klawisz kliknięty.." przewijanie było by zbyt szybkie przy tak małej liczbie zdarzeń (tzn. nie udałoby się nam przewinąć tekstu o 1 linijkę).

Należy tu wspomnieć, że MMF określa granicę górną szybkości wykonania całej pętli programu i jest to w przybliżeniu 0,01 sekundy, tzn., że 1 pętla programu nawet na super komputerze nie wykona się szybciej, natomiast nie nakłada granicy dolnej, czyli jeśli mamy bardzo wolny komputer, a program zawiera wiele linii kodu to niestety 1 wykonanie 1 pętli może zająć nawet 1 sekundę i więcej. Po tym, krótkim wyjaśnieniu przejdźmy do dalszych rozważań.

Tak, więc, aby tekst nie przewijał się zbyt szybko zastosujemy tu metodę pseudo bufora, tzn. wartość licznika "przewin" wykona się, co 4-czwarte (można, co 5, 6, 7 itd.) wykonanie pętli. Można prościej, np. stosując standardowy stoper jednak powoduje on pewne błędy, gdyż czas wskazywany przez niego jest niezależny od szybkości działania programu, ale to już zupełnie inna "bajka". My użyjemy w tym celu licznika "bufor", którego wartość będzie się zwiększać o 1 dopóki nie osiągnie 4. Gdy odpowiedni klawisz będzie wciśnięty (strzałka w górę, lub w dół) i kiedy licznik "bufor" będzie miał wartość 4, nastąpi dodanie, bądź odjęcie wartości od licznika "przewin" i przewinięcie tekstu w obiektach edycji do linii wskazywanej przez wartość tego licznika, po czym licznik "bufor" zostanie wyzerowany.

Oczywiście wcześniejszych dwóch zdarzeń nie usuwamy (w przeciwnym razie po jednokrotnym, krótkotrwałym naciśnięciu klawisza tekst nie przesunąłby się nawet o 1 linię).

7
+ EZ-keyboard.png Repeat while "down arrow" is pressed
+ EZ-counter.png value("bufor")=4
EZ-counter.png przewin: Add 1 to counter
EZ-edit.png miejsce: Scroll to line – value(„przewin”)
EZ-edit.png pseudo: Scroll to line – value(„przewin”)
EZ-edit.png wynik: Scroll to line – value(„przewin”)
EZ-edit.png data: Scroll to line – value(„przewin”)
EZ-edit.png czas: Scroll to line – value(„przewin”)
EZ-counter.png bufor: Set Counter to 0
8
+ EZ-keyboard.png Repeat while "up arrow" is pressed
+ EZ-counter.png value("bufor")=4
EZ-counter.png przewin: Subtract 1 from counter
EZ-edit.png miejsce: Scroll to line – value(„przewin”)
EZ-edit.png pseudo: Scroll to line – value(„przewin”)
EZ-edit.png wynik: Scroll to line – value(„przewin”)
EZ-edit.png data: Scroll to line – value(„przewin”)
EZ-edit.png czas: Scroll to line – value(„przewin”)
EZ-counter.png bufor: Set Counter to 0

Wszystko jest już cacy jeszcze tylko przy zakańczaniu poziomu tekst ze wszystkich obiektów edycji musimy zapisać do odpowiednich plików. U nas poziom kończy się, przy przejściu do klatki poprzedniej (gdzie wysyłamy rekordy), po klinknięciu przycisku o nazwie "Button 2". Aby przy ponownym starcie klatki zawierał już jakieś, być może nieaktualne rekordy, lepsze jednak takie niż żadne, a nie zawsze mamy dostęp do Internetu, żeby je odświeżyć.

9
+ EZ-button.png Button 2 clicked
EZ-edit.png miejsce: Save file - Appdrive$ + Appdir$ + "miejsce.txt”
EZ-edit.png pseudo: Save file - Appdrive$ + Appdir$ +”pseudo.txt”
EZ-edit.png wynik: Save file - Appdrive$ + Appdir$ + "wynik.txt”
EZ-edit.png data: Save file - Appdrive$ + Appdir$ + "data.txt”
EZ-edit.png czas: Save file - Appdrive$ + Appdir$ + "czas.txt”

Tak to już koniec.