Własne rekordy w MMF: Różnice pomiędzy wersjami

Klikipedia - klikowa encyklopedia
Skocz do: nawigacji, wyszukiwarki
(Jak to zakodować?)
Linia 64: Linia 64:
  
 
http://www.p9d.webd.pl/slimaczek/numery/slimaczek_07/nr7/dane/rekordy2.gif
 
http://www.p9d.webd.pl/slimaczek/numery/slimaczek_07/nr7/dane/rekordy2.gif
 
 
  
 
Edytujemy tekst obiektu "enter" 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).
 
Edytujemy tekst obiektu "enter" 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).
Linia 78: Linia 76:
  
 
http://www.p9d.webd.pl/slimaczek/numery/slimaczek_07/nr7/dane/rekordy4.gif
 
http://www.p9d.webd.pl/slimaczek/numery/slimaczek_07/nr7/dane/rekordy4.gif
 +
 +
===Edytor zdarzeń===
 +
W pierwszym zdarzeniu przy starcie klatki ograniczymy długość teksu, jaki można wpisać do obiektu "imie" na 20, oraz długość tekstu, jaki można wpisać do obiektu "data" na 10 (data ma postać np. 10-12-2006) dzięki temu łatwiej będzie nam potem zapisać wyniki do pliku binarnego. Ustawimy także wartość licznika "ile_rekordow" na ilość rekordów, jaką chcemy przechowywać np. 30.
 +
 +
{{Zdarzenie/Tabelka|naglowek=Limitowanie długości pól|zawartosc=
 +
 +
{{Zdarzenie|nr=1|
 +
warunki=
 +
{{warunek|tresc=http://www.p9d.webd.pl/slimaczek/numery/slimaczek_07/nr7/dane/rekordy13.gif run this event once}}
 +
|
 +
akcje=
 +
{{akcja|tresc=http://www.p9d.webd.pl/slimaczek/numery/slimaczek_07/nr7/dane/rekordy7.gif ile_rekordow: set Counter to 30}}
 +
{{akcja|tresc=http://www.p9d.webd.pl/slimaczek/numery/slimaczek_07/nr7/dane/rekordz5.gif imie: limit text size to 20}}
 +
{{akcja|tresc=http://www.p9d.webd.pl/slimaczek/numery/slimaczek_07/nr7/dane/rekordz5.gif data: limit text size to 10}}
 +
{{akcja|tresc=}}
 +
|
 +
}}
 +
}}
 +
 +
Utwórzmy teraz 6 grup o nazwach: "Dodaj rekord", "Wyświetl rekordy", "Zapisz rekordy", "Wczytaj rekordy", "Resetuj rekordy", "Obsluga listy". Wszystkie z grup oprócz grupy "Wczytaj rekordy" mają być nieaktywne przy starcie poziomu.
 +
 +
 +
 +
 +
 +
{{Zdarzenie/Tabelka|naglowek=Jeszcze słowem wstępu|zawartosc=
 +
 +
{{Zdarzenie|nr=1|
 +
warunki=
 +
{{warunek|tresc=Uppon pressing ENTER}}
 +
|
 +
akcje=
 +
{{akcja|tresc=''string'' set alterable string to StrAtX("imiona",1)}}
 +
|
 +
}}
 +
}}

Wersja z 21:16, 19 lis 2006

ARTYKUŁ W FAZIE KONSTRUKCJI, NIE EDYTOWAĆ

Czy zastanawiałeś się kiedyś jak zrobić własną listę rekordów, która nie miałaby ograniczeń standardowego obiektu "Hi-Score"? Jeśli tak, to ten kurs jest właśnie dla Ciebie. Uprzedzam, że cały przykład będzie wykonany w MMF, ale będzie można go z powodzeniem przerobić pod TGF. Wystarczy zamiast standardowego obiektu "Array" użyć "Dynamic Array" i "Fast Loop object" dostępnych w TGF.

Wprowadzenie

Na początku zastanówmy się, czym jest lista rekordów, czyli tzw. założenia wstępne. A więc zadaniem listy rekordów jest przechowywanie wyników uzyskiwanych przez graczy. Innymi słowy jest to ranking wyników z gry, który przechowuje najczęściej imię gracza i jego wynik, oraz inne informację o rekordzie. Co więcej lista ta przechowuje jedynie ściśle określoną ilość tych rekordów i aby się dostać na nią musi się uzyskać jakiś dość wysoki wynik. Kolejną bardzo ważną cechą rankingu wyników jest to, że wyniki są posortowane, czyli ułożone w odpowiedniej kolejności w zależności od uzyskiwanego wyniku. Z reguły jest to porządek malejący tzn., że rekord o wyższym wyniku jest wyżej na liście niż rekord o niższym wyniku. Rekordy te są pamiętane nawet po wyłączeniu gry. Oczywiście jedyną metodą zapamiętywania rekordów jest ich zapis w pliku. Aby uniemożliwić ingerencję i manipulację wynikami, przez graczy, plik ten powinien być zakodowany.

Założenia

Jak łatwo zauważyć standardowe "Hi-Score" nie spełnia kilku z naszych założeń. Miedzy innymi pozwala jedynie na przechowanie imienia gracza i jego wyniku i tylko tych dwóch informacji, a przecież czasem przydałaby się jeszcze informacja o rundzie, w której gracz zakończył grę, czy dacie ustanowienia wyniku. Dalej, rekordy przechowywane są w pliku INI, który nie jest w żaden sposób zabezpieczony, co umożliwia oszustwa, które oczywiście nie mają większego sensu. I dodatkowo możemy maksymalnie przechowywać tylko 20 rekordów.

Stworzona przez nas lista rekordów pozbawiona będzie wszystkich tych wad standardowego "Hi-Score". Oczywiście największym problemem w MMF jest sortowanie rekordów. Znanych jest wiele algorytmów sortowania. Niektóre z nich można z powodzeniem wykorzystać w MMF inne nie. My użyjemy najprostszej metody "sortowania bąbelkowego", moglibyśmy użyć innych szybszych metod jak choćby "sortowania przez wstawianie", czy "sortowanie przez kopcowanie", ale przy założeniu, że nasze rekordy będą przechowywane w tablicach, a naraz wstawiać będziemy 1 rekord wszystkie te metody mają podobną złożoność obliczeniową. Oczywiście istnieją inne szybsze metody sortowania jak choćby "sortowanie szybkie", które w większości przypadków jest najszybszym algorytmem sortowania. Jednak w MMF użycie tego algorytmu jest skomplikowane.

Trochę teorii

Tak jak wcześniej napisałem do posortowania listy rekordów użyjemy najprostszego algorytmu sortowania, "sortowania bąbelkowego". Omówię w skrócie, na czym polega ten algorytm. Załóżmy, zatem, że mamy jakąś przypadkową listę liczb np.: 4, 9, 1, 4, 5 którą chcemy posortować malejąco. Algorytm, bąbelkowy "postępuje" następująco sprawdza czy 5 liczba jest większa, od 4 jeśli tak zamienia je miejscami, w przeciwnym wypadku przechodzi dalej (u nas 4, 9, 1, 5, 4) następnie sprawdza 4 z 3 (u nas 4, 9, 5, 1, 4), 3 z 2 (u nas 4, 9, 5, 1, 4), 2 z 1 (u nas 9, 4, 5, 1, 4) jak widać po pierwszym wykonaniu takiej pętli lista nie jest posortowana, aby była posortowana należałoby tę samą operacje powtórzyć 4 razy (w ogólnym przypadku n-1 razy, jeśli za n przyjmiemy ilość elementów w liście). Należy jednak zauważyć, że element maksymalny jest na pierwszym miejscu już po pierwszym wykonaniu szeregu powyższych operacji, a to nam wystarczy w zupełności, bo dodawać będziemy po 1 rekordzie, czyli w chwili dodawania rekordu nasza lista będzie posortowana. Nasza lista rekordów na początku będzie pusta, (czyli np. 0, 0, 0, 0, 0), później będziemy dodawać jakiś rekord, (np. 4), zrobimy to w taki sposób, że sprawdzimy czy ostatni element listy jest mniejszy od tego, który chcemy wstawić, jeśli tak to na jego miejsce wstawimy nasz wynik (u nas 0<4, czyli 0, 0, 0, 0, 4) i wywołamy nasz algorytm sortowania bąbelkowego, czyli porównujemy 5 z 4 (0, 0, 0, 4, 0), 4 z 3 (0, 0, 4, 0, 0), 3 z 2 (0, 4, 0, 0, 0), 2 z 1 (4, 0, 0, 0, 0) jak widać nasz wynik znajduje się na początku, czyli tam gdzie powinien:). Nie ma sensu wykonywania jeszcze 3 razy tych samych czynności, bo nic to by nie zmieniło. Aby lepiej zrozumieć ten algorytm do obecnej naszej listy (4, 0, 0, 0, 0) wstawimy liczbę 2, czyli porównujemy 0<2, więc (4, 0, 0, 0, 2) i wykonujemy, algorytm sortowania bąbelkowego. Porównujemy 5 z 4 (4, 0, 0, 2, 0), 4 z 3 (4, 0, 2, 0, 0), 3 z 2 (4, 2, 0, 0, 0) i 2 z 1 (4, 2, 0, 0, 0) dwójka jest mniejsza, od 4 więc nie zamieniamy ich miejscami. Myślę, że po tym przykładzie zrozumiałeś algorytm sortowania bąbelkowego i całą ideę naszej listy rekordów. Teraz pozostał jedynie problem jak to przełożyć na zdarzenia w MMF, ale ten problem pozostawiam tobie .

Jak to zakodować?

W MMF do przechowywania rekordów nie użyjemy listy, a jednowymiarowych tablic, obiektów "Array". Dlaczego użyłem formy mnogiej tablic? Ponieważ nasze rekordy nie będą jedynie suchymi wynikami, bo nie miałoby to większego sensu. Do każdego wyniku będzie przypisane imię, data uzyskania wyniku i numer rundy, w której gracz zakończył grę. Tak, więc każdy rekord składać będzie się z 4 pól (imię, wynik, nr rundy, data), czyli do przechowania naszej listy rekordów użyjemy 4 tablic jednowymiarowych. Pewnie niektórzy z was zadają sobie pytanie: "no oki, ale co to jest ta tablica jednowymiarowa?" więc już wyjaśniam. Tablica jednowymiarowa to tak jakby (sorry, że przypominam o szkole) lista z dziennika, każdy wpis to imię i nazwisko, opatrzone indeksem, lub, jeśli ktoś woli numerem,. Tzn., jeśli np. Alojzy Kleks ma w dzienniku numer 5, to, jeśli chcemy się go pozbyć to wynajmując mordercę powiemy zabij osobę o numerze 5 (operowanie tu nazwiskami jest nie na miejscu), co on zrozumie jako zabij Kleksa:) Podobnie jest z obiektem "Array" w MMF, też składa się on z elementów tego samego typu (albo tekst, albo liczb), które mają swoje indeksy (numery).

Graficznie przedstawię przykładową tablicę "imiona":

INDEX 1 2 3 4 5
imię Jacek Adam Ambroży Stefan Polek

Aby na przykład imię o indeksie jeden wstawić do obiektu "string" po naciśnięciu klawisza "Enter" w MMF wystarczy wstawić następujące zdarzenie:

1
+ Uppon pressing ENTER
string set alterable string to StrAtX("imiona",1)

Po takiej akcji w obiekcie "string" zostanie wyświetlony napis "Jacek". Sorry za trochę przydługawe wyjaśnienie, ale bez poprawnego zrozumienia obsługi tablic w MMF cały kurs byłby dla was nie zrozumiały.

Realizacja

Utwórzmy nowy poziom "Rekordy" i edytujmy go wstawiając niezbędne obiekty.

Cztery obiekty tablic "Array" o nazwach "imiona", "wyniki", "rundy", "daty" do tych obiektów będziemy wczytywać rekordy i wykonywać operacje sortowania. "Binary object" dzięki temu obiektowi zapiszemy nasze rekordy do pliku po wcześniejszym ich zakodowaniu. Dziewięć obiektów edycji "Edit" z których 4 o nazwach "imie", "wynik", "runda", "data" posłużą do dodawania nowego rekordu, a 5 pozostałych o nazwach "Lpozycje", "Limiona", "Lwyniki", "Lrundy", "Ldaty" do prezentacji naszej listy rekordów. Obiekt "Custom Scrollbar", który posłuży nam do wykonania własnego paska przewijania (własnego czyt. z niestandardową grafiką). Cztery obiekty "Active System Box" o nazwach "Decrease", "Scroller", "Background", "Increase" posłużą do graficznego przedstawienia paska przewijania. Dwa liczniki, obiekty "counter" o nazwach "pom" i "ile_rekordow". Dwa obiekty "string" o nazwach "pom2" i "enter". I wreszcie 2 standardowe przyciski "Button" o nazwach "Dodaj rekord", "reset".

Zalecam abyście pozmieniali nazwy obiektów na takie, jakich ja używam będzie wam potem łatwiej .

Edytujemy obiekty tablic. Parametry tablic "imiona" i "daty" ustawiamy w następujący sposób:

rekordy1.gif

(chodzi tu o to, że dane, przechowywane w komórkach tych tablic będą tekstem)

A parametry tablic "wynik" i "runda" tak:

rekordy2.gif

Edytujemy tekst obiektu "enter" 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).

Edytujemy obiekt "Binary object" wpisując w pole "key" hasło, które będzie wykorzystywane w celu zakodowania pliku.

Edytujemy jeszcze obiekty "Lpozycje", "Limiona", "Lwyniki", "Lrundy", "Ldaty" i ustawiamy ich właściwości w następujący sposób:

rekordy3.gif

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

rekordy4.gif

Edytor zdarzeń

W pierwszym zdarzeniu przy starcie klatki ograniczymy długość teksu, jaki można wpisać do obiektu "imie" na 20, oraz długość tekstu, jaki można wpisać do obiektu "data" na 10 (data ma postać np. 10-12-2006) dzięki temu łatwiej będzie nam potem zapisać wyniki do pliku binarnego. Ustawimy także wartość licznika "ile_rekordow" na ilość rekordów, jaką chcemy przechowywać np. 30.

1
+ rekordy13.gif run this event once
rekordy7.gif ile_rekordow: set Counter to 30
rekordz5.gif imie: limit text size to 20
rekordz5.gif data: limit text size to 10

Utwórzmy teraz 6 grup o nazwach: "Dodaj rekord", "Wyświetl rekordy", "Zapisz rekordy", "Wczytaj rekordy", "Resetuj rekordy", "Obsluga listy". Wszystkie z grup oprócz grupy "Wczytaj rekordy" mają być nieaktywne przy starcie poziomu.



1
+ Uppon pressing ENTER
string set alterable string to StrAtX("imiona",1)