|
|
|
|
Własny system wyników online |
|
|
|
|
|
autor: 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 http://zagrajmy.superhost.pl/, 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.
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.
Do stworzenia systemu online, który będzie wysyłał wyniki z gry na stronę potrzebujemy kilku rzeczy: -serwera WWW z obsługą PHP i MySQL'a -plików skryptu PHP -dwóch pluginów, do MMF "String Parser 2" i "NOBU Http" 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
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.
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:
Teraz możemy przejść do edytora zdarzeń. Na początku oznaczenia obiektów:
W opisie będę jedynie używał nazw obiektów i mam nadzieję, że wcześniejsza legenda zapobiegnie pomyłkom.
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.
Run this event once>>pseudo: Limit text size to 20, wynik: Limit text size to 10,String: Set alterable string to "",
Po naciśnięciu przycisku "Button 2" nasza gra przechodzi do 2 poziomu.
Button "Button 2" clicked>> Storyboard Controls: 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".
Button "Button" clicked>> Button: Disable, Special conditions: 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ę.
Edittext$("pseudo”) = "">> Special conditions: Deactivate group "spr", Button: Enable, 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!!!". Val(Edittext$( "wynik”)) > 2147480000>> Special conditions: Deactivate group "spr", Button: Enable, 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.
Val(Edittext$( "wynik”)) <= 0>> Special conditions: Deactivate group "spr", Button: Enable, 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ę.
Only one action when event. loops>>NOBU Http: URL-"http://xxxxx.yoyo.pl/dodaj.php?id=" + Str$( Global Value A ) + "&autor=" + Edittext$( "pseudo" ) + "&wynik=" + Edittext$( "wynik" ) + "&haslo=alojzykleks”, Special conditions: 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.
NOBU Http: On Error>> String: Set alterable string to "Nastapiły problemy z wysłaniem rekordu!!!", NOBU Http: Download Cancel, Special conditions: Deactivate group "spr", Button: Enable,
Kiedy natomiast akcja wysyłania wyników zostanie zakończona pomyślnie również musimy poinformować o tym gracza i dezaktywować grupę "spr".
NOBU Http: Download Complete>> String: Set alterable string to downfile$( "NOBU Http" ), Special conditions: Deactivate group „spr”, Button: Enable,
To już koniec poziomu wysyłania 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 zapreze
-dwa liczniki, jeden nazwijmy "przewin", a drugi "bufor", -dwa standardowe przyciski, -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:
Teraz możemy przejść do edytora zdarzeń. Oznaczenia obiektów:
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:
Run this event once>> miejsce: Load text file- Appdrive$ + Appdir$ + "miejsce.txt", pseudo: Load text file- Appdrive$ + Appdir$ + "pseudo.txt", wynik: Load text file- Appdrive$ + Appdir$ + "wynik.txt", data: Load text file- Appdrive$ + Appdir$ + "data.txt", czas: Load text file- Appdrive$ + Appdir$ + "czas.txt", przewin: Set minimum value to 0, String Parser 2: Set default delimiter to „|-|”,przewin: Set maximum value to EditLineCount( "pseudo" ) - 15, String Parser 2: 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ą.
Button Button clicked>> NOBU Http: URL Download- "http://xxxxx.yoyo.pl/zwroc.php?id=" + Str$( Global Value A )=> Appdrive$ + Appdir$ + "temp.txt", Special conditions: 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.
NOBU Http: Download Complate>> miejsce: Set text "", pseudo: Set text "" , wynik: Set text "" , data: Set text "", czas: Set text "", String Parser 2: Load from file- Appdrive$ + Appdir$ + "temp.txt", przewin: Set maximum value to- listCount( "String Parser 2" ) / 5 – 15, przewin: Set counter to 0, Special conditions: 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".
On loop „z”>>miejsce: Set text - Edittext$( "miejsce" ) + listGetAt$( "String Parser 2", ( ( LoopIndex( "z" ) + 1 ) * 5 ) - 4 ) + string$( "String" ), Set text - Edittext$( "pseudo" ) + listGetAt$( "String Parser 2", ( ( LoopIndex( "z" ) + 1 ) * 5 ) - 3 ) + string$( "String" ), Set text - Edittext$( "wynik" ) + listGetAt$( "String Parser 2", ( ( LoopIndex( "z" ) + 1 ) * 5 ) - 2 ) + string$( "String" ), Set text - Edittext$( "data" ) + listGetAt$( "String Parser 2", ( ( LoopIndex( "z" ) + 1 ) * 5 ) ) + string$( "String" ), 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.
Upon pressing „Down Arrow”>>przewin: Add 1 to Counter, miejsce: Scroll to line – value(„przewin”), pseudo: Scroll to line – value(„przewin”), wynik: Scroll to line – value(„przewin”), data: Scroll to line – value(„przewin”), czas: Scroll to line – value(„przewin”), bufor: Set Counter to 0;
Upon pressing „Up Arrow”>>przewin: Subtract 1 from Counter, miejsce: Scroll to line – value(„przewin”), pseudo: Scroll to line – value(„przewin”), wynik: Scroll to line – value(„przewin”), data: Scroll to line – value(„przewin”), czas: Scroll to line – value(„przewin”), 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"
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ę).
(Repeat while "Down Arrow" is pressed)+(value("bufor”)=4) >>przewin: Add 1 to Counter, miejsce: Scroll to line – value("przewin"), pseudo: Scroll to line – value("przewin"), wynik: Scroll to line – value("przewin”), data: Scroll to line – value("przewin"), czas: Scroll to line – value("przewin”), bufor: Set Counter to 0;
(Repeat while "Up Arrow" is pressed)+( value( "bufor”)=4) >>przewin: Subtract 1 from Counter, miejsce: Scroll to line – value("przewin”), pseudo: Scroll to line – value("przewin”), wynik: Scroll to line – value("przewin”), data: Scroll to line – value("przewin”), czas: Scroll to line – value("przewin”), bufor: Set Counter to 0;
Wszystko jest już cacy
Button Button 2 clicked >> miejsce: Save file - Appdrive$ + Appdir$ + "miejsce.txt”, pseudo: Save file - Appdrive$ + Appdir$ +”pseudo.txt”, wynik: Save file - Appdrive$ + Appdir$ + "wynik.txt”, data: Save file - Appdrive$ + Appdir$ + "data.txt”, czas: Save file - Appdrive$ + Appdir$ + "czas.txt”,
Tak to już koniec
|
|
|
by pepe9donkey |
|