2001-08-11 00:08
Właściwie opis tej gry powinienem zacząć od wyjaśnienia kwestii dlaczego i po co zacząłem zmieniać coś co już istnieje i jest dostępne na FlashZone.pl jako Puzzle v1.
Otóż korzystając z tutoriala Puzzle v1 zrobiłem dla swojego dziecka puzzle składające się z 12 elementów. Szybko jednak okazało się że muszę przygotować następne puzzle z nowym obrazkiem. Ponieważ ręczne wprowadzanie współrzędnych w każdym z elementów było nieco czasochłonne, przy piątej grze postanowiłem ułatwić sobie pracę i napisać skrypt który będzie uniwersalny i niezależny od rozmiarów i położenia elementów układanki, skrypt który umożliwi mi masową produkcję puzzli i to w czasie nie przekraczającym 15 minut dla jednej układanki. Dlatego też przygotowałem Puzzle v2.
Przykładowy film składa się z 6 warstw. Użyłem aż tylu aby uzyskać większą przejrzystość projektu.
Warstwa "elementy" zawiera elementy przeciągane, z których trzeba ułożyć puzzle, natomiast warstwa "calosc" zawiera gotową układankę. Zawartości pozostałych warstw myślę że nie trzeba wyjaśniać, nazwy mówią same za siebie.
el_b1", "el_b2" itd. i wybieramy zachowanie "Button".el_m1", "el_m2" itd.el_m1", "el_m2"... i nazywamy "el1", "el2"...
Aby otworzyć okno edytora skryptów użyj przycisku Show Actions.
Warstwa akcje.
Akcja "Stop()" zatrzymuje odtwarzanie filmu w klatce nr 1.
Zmienna "il_el" przechowuje liczbę elementów układanki - należy ją wprowadzić ręcznie.
Zmienna "licznik" jest zwiększana o 1 za każdym razem gdy prawidłowo ułożymy fragment układanki.
W linii 4 i 5 za pomocą konstruktora "new Array()" definiujemy tablice o nazwach "tabOk_x" i "tabOk_y" które posłużą nam do przechowywania współrzędnych elementów puzzli.
Pętla "for" zawiera stan początkowy licznika "count=1", warunek powtórzenia pętli "count<=il_el" (to znaczy, że pętla będzie wykonywana do momentu w którym "count" nie osiągnie wartości większej od "il_el") oraz wartość przyrostu "count++" (która zwiększa licznik po wykonaniu pętli).
_root["el_ok"+count]._visible=0
ustawia widoczność elementu "el_ok" na zero, czyli obiekt jest niewidoczny. Zostanie on odsłonięty po prawidłowym ułożeniu elementu układanki.
_root - wskazuje główną listwę czasową
_root["el"+count]._alpha=70
ustawia przeźroczystość elementu "el" na 70% aby wyróżnić obiekty które nie są jeszcze ułożone.
Powyższy zapis akcji (z linii 7 i 8) w nowej notacji Flasha 5 zastępuje akcję "set Property" (która oczywiście jest nadal dostępna).
set ("Ok_x"+count, _root["el_ok"+count]._x)
tworzymy zmienne o nazwach "Ok_x1", "Ok_x2" itd., które zawierają współrzędne X elementów "el_ok" odczytanych przy pomocy właściwości "_x".
Wprowadzając tą zmienną w trybie Normal Mode musimy pamiętać o zaznaczeniu opcji "expression" dla pól "Variable" i "Value"
Teraz należy przygotować tablicę przechowującą współrzędne określające prawidłowe upuszczenie elementu układanki.
Ponieważ trafienie z dokładnością co do 1 pixela byłoby rzeczą dosyć trudną do zrobienia musimy określić pewien zakres tolerancji w granicach której element zostanie uznany za prawidłowo ułożony. Dlatego też w tablicy umieszczamy zmienne ["Ok_x"+count] powiększone i pomniejszone o 10 pixeli. Używamy funkcji "eval" ponieważ jeżeli jej argument jest zmienną lub właściwością to zwraca ona jej wartość, w przeciwnym wypadku tablica zawierała by ciąg znaków "Ok_x110".
Zmienna "Ok_y" i tablica "tabOk_y" analogicznie jak "Ok_x" i "tabOk_x".
Przeanalizujmy jeszcze raz całość skryptu w klatce 1.
"Stop()" zatrzymuje film w klatce 1, "il_el=9" określa ilość elementów puzzli, "licznik" - zlicza elementy prawidłowo ułożone, konstruktor "new Array()" definiuje tablice o nazwach "tabOk_x" i "tabOk_y", za pomocą pętli "for" określamy ilość zmiennych użytych w filmie a odpowiadającą ilości elementów puzzli. Właściwość "_visible" ukrywa wszystkie elementy gotowych puzzli a właściwość "_alpha" ustawia na 70% przeźroczystość elementów do ułożenia. Następnie odczytujemy współrzędne X i Y elementów gotowych puzzli i umieszczamy je w zmiennych ["Ok_x"+count] i ["Ok_y"+count]. Wreszcie zmienne ["Ok_x"+count] i ["Ok_y"+count] umieszczamy w tablicach i określamy tolerancję dla puszczonego elementu na +/- 10 pixeli.
Teraz akcje umieszczone w przeciąganych elementach układanki (el1, el2...).
el1" w którym wprowadzimy odpowiedni skrypt.
on(rollOver) {
element = new String(this._name);
indeks = element.slice(2,4)
}
Po najechaniu wskaźnikiem myszy tworzy obiekt typu "String" (obiekty typu String służą do operacji związanych z ciągami znaków i zastępują funkcje znakowe) o nazwie "element" odczytujący nazwę "_name" wskazanego elementu "this", zmienna "indeks" pobiera z nazwy wskazanego elementu za pomocą metody "slice" podciąg zaczynający się po znaku o numerze 2 do znaku o numerze 4 (czyli znaki 3 i 4). W naszym przykładzie wystarczył by tylko jeden znak o numerze 3 ale być może ktoś zechce stworzyć puzzle z 10 lub więcej elementów. Pobrany podciąg odpowiada numerowi danego elementu, czyli z nazwy np. el1 pobierany jest podciąg "1", gdyby istniał element o nazwie el29 został by pobrany podciąg "29". Dzięki temu skrypt wie z którym elementem ma do czynienia (jest to ważne przy odczytywaniu danych z tablic).
on(press) {
startDrag (this);
}
Po naciśnięciu lewego przycisku myszy zaczynamy przeciągać element.
on(release){
...
}
W chwili puszczenia przycisku myszy odczytujemy współrzędne X i Y przeciąganego elementu (this) i umieszczamy je w zmiennych "el_x", "el_y".
Teraz rzecz najważniejsza, czyli odczytanie zawartości tablicy.
Współrzędne umieszczone są w tablicy w następujący sposób:
kolumna 0 kolumna1
"el1" - wiersz 1 współrzędna+10 współrzędna-10
"el2" - wiersz 2 współrzędna+10 współrzędna-10
itd.
if" sprawdzamy poprawność upuszczenia elementu "el" i jeżeli nam się powiodło skrypt przechodzi dalej.this._visible=0
_root["el_ok"+indeks]._visible=1
el_ok" with (_root.ding)
gotoAndPlay(2)
ding" "with" - zastępuje akcję "tell Target" Flasha 4 oznaczoną przez Macromedia jako wycofywaną._root.licznik += 1
if (_root.licznik==_root.il_el){
with (_root){
gotoAndStop(2);
}
}
licznik" jest taka sama jak zmienna "il_el" to znaczy, że ułożyliśmy prawidłowo całe puzzle więc film przechodzi do drugiej klatki głównej listwy czasowej _root i zatrzymuje się wyświetlając tekst gratulacyjny.if" zostanie pominięty i wykonana zostanie akcja "stopDrag" - koniec przeciągania.Stop()" żeby dźwięk nie zaczął się sam odtwarzać. Do klatki drugiej importujemy dźwięk który będzie potwierdzał prawidłowe ułożenie elementu puzzli. Symbol "ding" umieszczamy w klatce 1 warstwy "dzwięki", do drugiej klatki importujemy dźwięk z oklaskami odtwarzanymi łącznie z tekstem gratulacyjnym po prawidłowym ułożeniu całości puzzli.