Część 5.
Przetwarzanie informacji
Części składowe języka HTML
Niniejszy rozdział opowiada o zarządzaniu danymi za pomocą zmiennych, wyrażeń i warunków. Zetknąłeś się już częściowo z tym tematem we wcześniejszych rozdziałach, teraz jednak omówimy go bardziej szczegółowo. Zrozumienie zasad wprowadzania, modyfikowania i szacowania danych pomoże ci prawdziwie „reżyserować” twoje filmy i dynamicznie zmieniać poszczególne jego elementy: grafikę, animację i dźwięk.
|
Zmienne służą do przechowywania informacji. Zmienne możesz tworzyć, zmieniać ich zawartość i odrzucać w dowolnej chwili. Proces podstawiania informacji do zmiennej po raz pierwszy nazywa się deklarowaniem zmiennej. Deklarowanie i przekształcanie zmiennej odbywa się przy udziale akcji set variable. Zmienne deklarowałeś już wcześniej, tylko nie nazywaliśmy tak tego procesu. Kiedy tworzysz nowe obiekty za pomocą akcji set variable, jak w wyrażeniu mójKolor = nowy Kolor (mójKlipFilmowy), jednocześnie deklarujesz zmienną (tutaj mójKolor). W tym akurat przypadku zmienna przechowuje obiekt koloru, ale ogólnie może przechowywać dowolny typ informacji, np. liczbę, litery, wartość — prawda lub fałsz, a nawet odwołanie do innej zmiennej. Różne typy informacji przechowywanych w zmiennych noszą nazwę typów danych.
|
Zmienne i typy danych Przykładami typowych zmiennych mogą być: wynik gracza (zmienna liczbowa), obiekt dźwiękowy (zmienna łańcucha danych), stan włączony lub wyłączony przycisku wyboru (radio button) (zmienna boole'owska). Typ danych przechowywanych w zmiennej można łatwo zmienić. Zmienna zadeklarowana pierwotnie jako zmienna liczbowa może zostać zmieniona w dowolnej chwili odtwarzania filmu na zmienną łańcucha danych przez wprowadzenie nowej akcji set variable. Jednak lepiej jest utrzymywać stały typ zadeklarowanych zmiennych, dzięki czemu w czasie manipulowania nimi nie zostaniesz zaskoczony niespodziewanymi rezultatami (jak np. mnożenie łańcucha znaków przez inny łańcuch znaków). Różne typy danych przechowywanych w zmiennych przedstawia tabela 9.1. Nazwy zmiennych powinny opisywać rodzaj przechowywanych w nich informacji. Na przykład, punktyGracza i prędkośćPojazdu są zupełnie poprawnymi nazwami zmiennych i z pewnością przyprawią cię o mniejszy ból głowy, niż coś w rodzaju xyz lub mojaZmienna. Zwykle zapisuje się nazwy zmiennych bez spacji pomiędzy wyrazami, za to z wielką literą rozpoczynającą każdy kolejny wyraz za wyjątkiem pierwszego.
|
||
Tabela 9.1. Typy danych do przechowywania w zmiennych |
|||
Typ danych Opis Przykład |
|||
Liczba |
Wartość liczbowa. |
mójWynik = 24 |
|
Łańcuch znakowy |
Sekwencja znaków, liczb lub symboli. Łańcuch zawsze zapisuje się w cudzysłowie. |
twójEmail = "johndoe@domena.com" |
|
Typ boole'owski |
Wartość typu prawda (true) lub fałsz (false). Nie stosuje się cudzysłowu. Zamiast prawda można pisać 1, a w miejsce słowa fałsz podstawiać 0. |
przyciskOpcji = true |
|
Obiekt |
Nazwa obiektu utworzonego za pomocą funkcji konstruktora. |
mójKolor = nowy Kolor(mójFilm) |
|
|
Rys. 9.1. Zmienne można deklarować do przechowywania różnych typów informacji. Liczba (u góry) wymaga zaznaczenia pola wyboru Expression obok pola Value. W przypadku łańcucha znakowego (u dołu) pole wyboru Expression obok pola Value pozostawia się niezaznaczone
|
W celu zadeklarowania zmiennej:
Wskazówki
|
W celu
W celu
W polu Value pojawi się akcja getProperty wraz z argumentami target oraz property (rys. 9.3).
|
Rys. 9.2. Użyj składni z kropką do podstawienia właściwości obiektu do zmiennej. Tutaj zmiennej myXPosition odpowiada współrzędna x obiektu myMovieClip w głównej listwie czasowej. Obecnie zmienna ta przechowuje wartość 100
Rys. 9.3. Akcja getProperty wymaga podania argumentów target i property
|
Rys. 9.4. Argumentem target jest ścieżka _root.myMovieClip, a właściwość to współrzędna x klipu filmowego myMovieClip. Wartość ta przypisana jest zmiennej myXPosition
|
Wskazówka
xPosition = _xmouse Po zadeklarowaniu tej zmiennej, o nazwie xPosition w pierwszym ujęciu twojego filmu, przechowuje ona wartość współrzędnej x położenia wskaźnika myszy. W czasie przesuwania wskaźnika po ekranie właściwość _xmouse oczywiście ulega zmianie, jednak wartość zmiennej xPosition pozostaje taka, jak w momencie deklaracji (czyli wykonania akcji wyrażenia set variable). Żeby zmienna mogła przyjmować nowe wartości, trzeba umieścić ją w pętli, tak jak zdarzenia klipu filmowego EnterFrame lub Mouse move.
|
Kiedy używasz akcji set variable do podstawienia informacji do zmiennej, masz możliwość zaznaczenia opcji Expression w bloku edycji parametrów dla pól Variable oraz Value (rys. 9.5). Zaznaczenie tej opcji dla pola Value powoduje usunięcie znaku cudzysłowu otaczającego wprowadzoną informację i traktowanie jej jako wyrażenia, a nie łańcucha znakowego. Wyrażenie to linia kodu, mogąca zawierać zmienne, właściwości i obiekty, które muszą zostać oszacowane, zanim Flash będzie mógł określić ich wartość. Wyrażenie przypomina wzór matematyczny, np. a2 + b2. Wartość wyrażenia musi zostać obliczona, zanim nastąpi przypisanie jej do zmiennej (rys. 9.6). Z drugiej strony, łańcuch znakowy jest traktowany przez Flasha po prostu jako grupa znaków. W tym przypadku wzór a2 + b2 jest tylko i wyłącznie sekwencją siedmiu znaków (przy wyliczeniu odstępów). Kiedy deklarujesz zmienną znakową, musisz pozostawić pole Expression niezaznaczone. W przypadku każdego innego typu danych pole to powinno być zaznaczane. Z kolei zaznaczenie pola Expression, widniejącego obok pola Variable, zmienia całe wyrażenie w oknie skryptu, nadając mu formę set (variable, value). Ta składnia umożliwia jednoczesne wprowadzenie wyrażenia zmiennej i jej wartości. Na przykład, wybierając dla zmiennych nazwy player1, player2 i player3, możesz je szybko utworzyć za pomocą wyrażenia "player" + counter, gdzie counter jest również zmienną, przechowującą liczbę (rys. 9.7). Ten rodzaj wyrażenia zostanie omówiony w dalszej części rozdziału.
|
Rys. 9.5. Dla pól Variable oraz Value w bloku edycji parametrów są dostępne pola wyboru Expression
Rys. 9.6. Przykłady wyrażeń. Nazwy zmienne stoją po lewej stronie znaku równości, wyrażenia po prawej
Rys. 9.7. Akcja set action (dostępna tylko przy wykorzystaniu akcji set variable) pozwala użyć wyrażenia dla nazwy zmiennej
|
Tabela 9.2. Najczęściej spotykane sekwencje opuszczania znaku |
Wskazówka
|
|
Sekwencja Znak |
|
|
\b |
Backspace |
|
\r |
Return |
|
\t |
Tab |
|
\" |
Cudzysłów |
|
\' |
Pojedynczy cudzysłów |
|
\\ |
Odwrócony ukośnik |
|
|
|
|
|
|
Zmiennych i wyrażeń używa się w skrypcie jako znaków-wypełniaczy dla parametrów. Niemal w każdej akcji, wymagającej określenia parametrów, możesz zamiast nich podstawiać zmienne lub wyrażenia. Na przykład podstawowa akcja gotoAndStop umożliwia ci wprowadzenie w polu Frame wyrażenia zamiast numeru ujęcia. Wyrażeniem może być zmienna o nazwie mojaKarta, przechowująca liczbę z zakresu 1 do 52. Klatki na listwie czasowej o numerach 1 do 52 mogłyby wtedy zawierać grafiki 52 kart do gry, a zmiana zmiennej w akcji gotoAndStop mogłaby powodować wyświetlanie różnych kart. W przypadku akcji getURL, pole URL może zawierać wyrażenie zamiast właściwego adresu internetowego. Przykładowo, wyrażenie może stanowić łańcuch znakowy połączony ze zmienną, jak w ”http://”+twojaWitryna Sieciowa. Zmiana zmiennej o nazwie twojaWitrynaSieciowa będzie powodować wczytywanie różnych adresów URL przez akcję getURL. Wartości dla właściwości obiektów oraz ścieżki dostępu do obiektów mogą być zastępowane wyrażeniami w akcji setProperty (rys. 9.8). Innym powszechnym sposobem użycia zmiennej jest prosty licznik. Zamiast zajmować miejsce parametru, zmienna w tym przypadku przechowuje numer określonego typu zdarzenia, potrzebny do późniejszego przywołania i sprawdzenia. Wynik punktowy gracza może być przechowywany w zmiennej, dzięki czemu Flash określi, czy gracz osiągnął ilość punktów potrzebną do ukończenia gry.
|
Rys. 9.8. Przykłady podstawiania zmiennych i wyrażeń w polach określania parametrów akcji: zmienna frameNumber w akcji gotoAndPlay (u góry), zmienne myURL oraz myWindowName w akcji getURL (w środku) i zmienne MovieClipName oraz myRotation w akcji setProperty (u dołu)
|
Rys. 9.9. Zmiennej frameNumber przypisano wartość 5
Rys. 9.10. Po wybraniu Expression z menu rozwijanego Type możesz podstawić zmienną frameNumber w polu Frame
Rys. 9.11. Kiedy użytkownik zwolni przycisk umieszczony w dolnej warstwie, Flash odczyta na podstawie zmiennej (frameNumber) numer ujęcia, do którego ma przeskoczyć - tutaj jest to klatka 5
|
W celu wprowadzenia zmiennej
Twoja zmienna przechowuje liczbę. W momencie wykonywania akcji gotoAndPlay Flash używa tej liczby jako oznaczenia ujęcia, które ma odtworzyć. Wskazówka
|
Każda deklarowana zmienna należy do określonej listwy czasowej. Właściwość ta nazywana jest zakresem działania zmiennej. Jeśli zadeklarujesz zmienną z poziomu głównej listwy czasowej, to właśnie ta zmienna będzie ograniczona zakresem działania do głównej listwy czasowej. Jeśli zadeklarujesz zmienną z poziomu klipu filmowego, to będzie ono ograniczona zakresem działania do tego właśnie klipu filmowego. Zakres działania zmiennej to niejako jej dom. Zmienne „egzystują” w określonych listwach czasowych, więc jeśli chcesz użyć informacji przechowywanej w którejś ze zmiennych, musisz najpierw podać do niej ścieżkę dostępu. Mamy tutaj sytuację podobną do określania ścieżek do klipów filmowych. Żeby uzyskać dostęp do klipu filmowego lub zmiennej, trzeba je zidentyfikować za pomocą ścieżki dostępu. Konstruując ścieżki dostępu dla zmiennych, możesz używać terminów określania względności _root, this oraz _parent. W kolejnym ćwiczeniu utworzysz menu rozwijane wczytujące witrynę sieciową za pomocą akcji getURL. Adres URL dla tej akcji będzie przechowywany w zmiennej zadeklarowanej i osadzonej w głównej listwie czasowej. Jako że akcja getURL rezyduje w klipie filmowym menu rozwijanego, zarówno zmienna, jak i akcja korzystająca z tej zmiennej mają różne zakresy działania. Użyjesz więc ścieżki dostępu do zidentyfikowania zmiennej w głównej listwie czasowej z poziomu listwy czasowej klipu filmowego.
W celu zidentyfikowania zmiennej
|
Rys. 9.12. Klip filmowy w formie menu rozwijanego posiada dwa stany - zwinięte (collapsed) i rozwinięte (expanded) - które mogą się zmieniać
|
Rys. 9.13. Zadeklaruj zmienną myURL będącą adresem witryny wydawnictwa Peachpit Press
Rys. 9.14. Dla ostatniego przycisku w menu rozwijanym przypisz w polu URL akcję _root.myURL. Jako że akcja ta jest przypisywana wewnątrz klipu filmowego menu rozwijanego, wpisanie _root jest niezbędne do zidentyfikowania zmiennej myURL, zadeklarowanej przecież w głównej listwie czasowej
|
Ta zmienna została zadeklarowana w głównej listwie czasowej i przechowuje dane w postaci łańcucha znakowego.
|
W celu przypisania zmiennej
Teraz twoja zmienna będzie osadzona w klonie klipu filmowego w miejsce głównej listwy czasowej.
Kiedy zwolnisz przycisk zawarty w klipie filmowym, Flash odczyta informację przechowywaną w zmiennej osadzonej w klipie filmowym. Ponieważ po zadeklarowaniu zmiennej ograniczono jej zakres działania do klipu filmowego, Flash potrafi ją zlokalizować i użyć przechowywanej w niej informacji jako adresu URL.
|
Rys. 9.15. Ścieżka dostępu menu.myURL deklaruje zmienną myURL w klipie filmowym będącym menu rozwijanym
Rys. 9.16. Ostatni przycisk w rozwijanym menu wymaga podania tylko nazwy zmiennej myURL, jako że zmienna ta jest osadzona właśnie w klipie filmowym menu rozwijanego
|
|
Wczytywanie zmiennych Tak naprawdę, to zmiennych wcale nie trzeba deklarować wewnątrz filmu. Flash pozwala na przechowywanie ich w dokumentach tekstowych, w każdej chwili możliwych do wczytania. W ten sposób możesz łatwo edytować zmienne w obrębie takiego dokumentu tekstowego, a w rezultacie zmieniać cały film bez używania narzędzi Flasha. Dla przykładu, tworząc quiz działający w oparciu o zmienne w postaci pytań i odpowiedzi, przechowuj owe zmienne w dokumentach tekstowych. Kiedy później będziesz chciał wymienić pytania, wystarczy, że dokonasz edycji samego dokumentu. Ponadto zmienne w dokumentach tekstowych mogą być generowane automatycznie przy pomocy skryptów serwerowych, bazujących na danych dostarczanych z zewnątrz. Flash może wtedy odczytywać zmienne z dokumentu tekstowego tylko z ostatnio wprowadzanymi przez użytkownika wartościami. Taki zewnętrzny dokument tekstowy może przechowywać dowolną ilość zmiennych, ale musi być zapisany w formacie MIME - standardowym formacie wykorzystywanym w skryptach CGI. Zmienne zapisywane są w następujący sposób: zmienna1=wartość1&zmienna2= wartość2&zmienna3=wartość3 gdzie pary zmienna — wartość oddzielane są pojedynczym znakiem &. Zmienne mogą być wczytywane do określonego poziomu lub do wskazanego klipu filmowego. W obu przypadkach musisz jednak pamiętać o ich zakresach działania, jeśli masz zamiar odczytywać wartości tych zmiennych.
|
Flash wczyta zmienne z dokumentu tekstowego do poziomu 0 lub do głównej listwy czasowej.
|
Rys. 9.17. Dwie zmienne i ich wartości, zapisane w formacie MIME. W tym przykładzie, zmienne są zapisane w dokumencie tekstowym o nazwie data.txt
Rys. 9.18. Akcja LoadVariablesNum wczytuje zmienne z pliku data.txt do poziomu 0
|
Rys. 9.19. Wartość zmiennej myRotation z pliku tekstowego jest wykorzystywana do określenia stopnia obrotu klipu filmowego
Rys. 9.20. Dwie dodatkowe akcje setProperty zmieniają skalę klipu filmowego, używając w tym celu zmiennej mySize z pliku tekstowego. Klip filmowy przed wystąpieniem zdarzenia keyDown (u góry z lewej) oraz po wystąpieniu zdarzenia (u góry z prawej)
|
Kiedy naciśniesz klawisz, Flash użyje wczytanych zmiennych jako wartości potrzebnych do wykonania rotacji klipu filmowego.
Wskazówki
|
|
Zmienne są użyteczne, ponieważ można zmieniać ich zawartość wraz z odświeżeniem informacji o statusie filmu lub użytkownika. Czasami sprowadza się to tylko do przypisania zmiennej nowej wartości. Kiedy indziej trzeba wartości zmiennych dodać, odjąć, pomnożyć lub podzielić, zmienić wartość boole'owską true na false czy też zmodyfikować łańcuch znakowy przez dodanie kilku znaków. Przykładowo, zmienna mójWynik może być zadeklarowana z wartością 0. Później, z każdym punktem zdobytym przez gracza, wartość tej zmiennej będzie rosła o 1. Przeprowadzaniem operacji polegających na modyfikowaniu informacji przechowywanych w zmiennych zajmują się operatory - symbole, które „operują” danymi.
Operator przypisania Operator przypisania (=) to pojedynczy znak równości, który przypisuje zmiennej określoną wartość. Miałeś już okazję korzystać z tego operatora w akcjach set variable, które automatycznie wstawiają operator przypisania do informacji wprowadzanych w polach Variable oraz Value. Możesz też użyć akcji evaluate, która udostępnia puste pole Expression w bloku edycji parametrów. W polu tym wprowadzasz nazwę zmiennej, wartość i operator przypisania pomiędzy nimi (rys. 9.21). Inne powszechnie używane operatory znajdziesz w tabeli 9.3.
|
Rys. 9.21. Akcje set variable (u góry) oraz evaluate (u dołu) tworzą skrypty o równoważnym znaczeniu. W przypadku akcji evaluate musisz jednak sam wprowadzić operator przypisania
|
|
|
Tabela 9.3. Najczęściej używane operatory |
|
|
Symbol Opis |
|
|
+ |
Dodawanie. |
|
- |
Odejmowanie. |
|
* |
Mnożenie. |
|
/ |
Dzielenie. |
|
++ |
Zwiększa wartość o jeden. x++ jest równoważne z x = x + 1. |
|
-- |
Zmniejsza wartość o jeden. x-- jest równoważne z x = x - 1. |
|
+= |
Dodaje wartość i przypisuje ją zmiennej. x += 5 jest równoważne z x = x + 5. |
|
-= |
Odejmuje wartość i przypisuje ją zmiennej. x -= 5 jest równoważne z x = x - 5. |
|
*= |
Mnoży przez wartość i przypisuje wynik zmiennej. x *= 5 jest równoważne z x = x * 5. |
|
/= |
Dzieli przez wartość i przypisuje wynik zmiennej. x /= 5 jest równoważne z x = x / 5. |
|
|
|
|
|
Rys. 9.22. Po każdym zwolnieniu wciśniętego przycisku, przypisana do niego akcja zwiększa wartość zmiennej rotation o 10
|
Operatory są koniem pociągowym interaktywności Flasha. Będziesz ich często używał do przeprowadzania obliczeń w tle, dodawania wartości jednej zmiennej do innej lub zmieniania właściwości obiektu przez dodanie albo odjęcie wartości zmiennej. Poniższy przykład pokazuje proste zastosowanieoperatorów do modyfikowania zmiennej oddziałującej na grafikę filmu. Utworzysz przycisk, który zwiększa wartość zmiennej po każdym jego wciśnięciu. Wspomniana zmienna jest używana do ustawiania kąta obrotu klipu filmowego.
W celu zwiększenia wartości zmiennej
Wyrażenie to dodaje 10 do bieżącej wartości i przypisuje sumę do zmiennej o nazwie rotation.
|
Zdarzenie EnterFrame sprawia, że akcja setProperty jest wykonywana nieustannie. W wyniku jej działania obrót klipu filmowego jest przypisywany do wartości zmiennej rotation, którą użytkownik może zwiększyć, zwalniając przycisk.
Wskazówki
|
Rys. 9.23. Stopień obrotu bieżącego klipu filmowego jest nieustannie uaktualniany do wartości zmiennej rotation w głównej listwie czasowej
Rys. 9.24. Lufa tego działa to klip filmowy, którego właściwość obrotu (_rotation) zmienia się stosownie do wartości zmiennej rotation
|
Rys. 9.25. Klip filmowy mushroom jest powielany po każdym zwolnieniu przycisku. Nazwa nowego klonu oraz jego poziom głębokości zależą od wartości zmiennej counter
|
Wiązanie zmiennych Operator dodawania (+) sumuje wartości danych liczbowych. Jednak można użyć go także do łączenia łańcuchów znakowych i zmiennych przechowujących dane znakowe. Operacja taka nazywa się wiązaniem. Wiązanie zmiennych i łańcuchów znakowych umożliwia tworzenie ścieżek dostępu i skomplikowanych wyrażeń. Na przykład, często praktykowanym sposobem nadawania nazw zduplikowanym klonom filmowym jest wiązanie zmiennej z nazwą oryginalnego klipu filmowego. Zmienna jest po prostu licznikiem dodającym wartość 1 za każdym razem, kiedy następuje powielenie klipu. Jeśli nazwą klipu filmowego jest mushroom (grzyb), a nazwą zmiennej Counter (licznik), to możesz dowiązać nową nazwę za pomocą wyrażenia: "mushroom" + counter a rezultatem będą kolejne nazwy, np. mushroom1, mushroom2 itp.
W celu dowiązania
|
Akcja setProperty umieści duplikat klipu filmowego w nowym miejscu, według współrzędnej x określonej na podstawie wartości zmiennej. Dzięki temu będziesz mógł dostrzec duplikat.
Za każdym razem, kiedy zwalniasz przycisk i tworzysz duplikat klipu filmowego, twoja zmienna zwiększa wartość o 1. Stąd nowe duplikaty zawsze otrzymują unikalne nazwy, oparte na wiązaniu łańcucha znakowego (nazwy klipu) i zmiennej oraz indywidualne poziomy głębokości i współrzędną x położenia na scenie (rys. 9.28).
|
Rys. 9.26. Duplikat klipu mushroom wędruje w nowe miejsce
Rys. 9.27. Zmienna counter zwiększa swoją wartość o 1
Rys. 9.28. Powielone tańczące grzybki otrzymują nazwy utworzone w rezultacie wiązania łańcucha znakowego „mushroom” ze zmienną counter
|
Rys. 9.29. Metoda stop jest dołączana do każdego nowego duplikatu klipu filmowego mushroom
Rys. 9.30. Przerwane zostaje odtwarzanie każdego nowego duplikatu klipu filmowego mushroom
|
Po utworzeniu nowych zmiennych lub obiektów w wyniku wiązania — możesz ich używać w innych wyrażeniach. Jednak, dla oszacowania zawartości tych wyrażeń musisz użyć funkcji eval. Funkcja ta odczytuje wyrażenie i zwraca wartość w postaci pojedynczego łańcucha znakowego. Załóżmy np., że chcesz odczytać wartość poziomu przezroczystości zduplikowanego klipu filmowego mushroom2. Mógłbyś spróbować posłużyć się takim wyrażeniem: "mushroom" + counter + "._alpha" jednak Flash odczyta to wyrażenie jako łańcuch znakowy i nie rozpozna, że _alpha to właściwość klipu mushroom2. Rozwiązaniem tego problemu jest zgrupowanie pierwszej części wyrażenia w postaci argumentu funkcji eval, a następnie dopisanie właściwości, jak niżej: eval ("mushroom" + counter)._alpha Funkcji eval możesz używać wtedy, kiedy wyrażeń wiązanych, np. w ścieżkach dostępu lub argumentach metod.
W celu użycia
Wyrażenie eval szacuje wiązanie, a następnie dołącza do niego metodę (rys. 9.30). |
Zmienne oraz wyrażenia są ściśle powiązane z wyrażeniami warunkowymi. Informacje, które odczytujesz, przechowujesz w zmiennych i modyfikujesz za pomocą wyrażeń, będą naprawdę użyteczne dopiero wtedy, kiedy porównasz je z innymi fragmentami danych. Wykonanie takiego porównania to zadanie właśnie dla wyrażeń warunkowych, które ponadto umożliwiają zrealizowanie dalszych instrukcji, w zależności od otrzymanych rezultatów. Logika wyrażeń warunkowych sprowadza się w zasadzie do instrukcji: „Jeśli abc jest prawdą, to wykonaj xyz”, a we Flashu definiuje się zarówno abc (warunek), jak i xyz (konsekwencja). Wyrażenia warunkowe przypominają też trochę manipulatory zdarzeń - obydwie funkcje reagują na określone sytuacje. W przypadku manipulatorów zdarzeń, taką sytuacją jest zazwyczaj ruch myszą lub kliknięcie jej klawiszem. W wyrażeniach warunkowych natomiast sytuacją jest bieżący status zmiennej lub właściwości obiektu. Wyrażenia warunkowe zaczynają się od instrukcji if (). Argument znajdujący się w nawiasach jest warunkiem - wyrażeniem porównującym jedną rzecz z drugą. Czy zmienna mójWynik ma większą wartość od zmiennej najlepszyWynik? Czy właściwość _droptarget mojego przeciąganego klipu filmowego jest niezgodna ze ścieżką dostępu do klipu filmowego mójŚmietnik? Czy właściwość _currentFrame głównej listwy czasowej ma wartość 10? To wszystko przykłady warunków. Jak się je konstruuje? Za pomocą operatorów porównywania, dołączanych do wyrażeń.
|
|
Tabela 9.4. Operatory porównywania |
Operatory porównywania Operator porównywania szacuje wartości po obu stronach wyrażenia i zwraca wartość prawdy (true) lub fałszu (false). Operatory te wymieniono w tabeli 9.4. Kiedy po oszacowaniu warunku okazuje się, że został spełniony (prawda), następuje wykonanie konsekwencji, określonej w nawiasach klamrowych wyrażenia if (rys. 9.31). W przypadku niespełnienia warunku (fałsz), wszystkie akcje zamknięte w klamrach są ignorowane. W poniższym ćwiczeniu skorzystasz z pliku, który utworzyłeś w celu wykonania obrotu lufy działa, w podrozdziale „Modyfikowanie zmiennych”. Chcemy ustalić maksymalne odchylenie lufy na poziomie 90 stopni, dlatego też skonstruujemy wyrażenie warunkowe nakazujące Flashowi sprawdzać, czy wartość wychylenia (obrotu) jest większa niż 90. W przypadku spełnienia warunku, rotacja lufy zatrzyma się na poziomie 90 stopni, zapobiegając tym samym wychyleniu jej poniżej poziomej linii podstawy.
W celu wprowadzenia
|
|
Symbol Opis |
||
== |
Równe z... |
|
< |
Mniejsze niż |
|
> |
Większe niż |
|
<= |
Mniejsze lub równe |
|
>= |
Większe lub równe |
|
!= |
Nie jest równe z... |
|
|
||
Rys. 9.31. Wtedy i tylko wtedy, gdy spełniony jest warunek określony w nawiasach, zostaną wykonane konsekwencje warunku - consequence1, consequence2 i consequence3
Rys. 9.32. Dodaj warunek do akcji przypisanych do prawego przycisku, który będzie sprawdzał wartość zmiennej rotation |
|
Jeśli wartość zmiennej przekracza 90, Flash resetuje jej wartość z powrotem na 90. Dzięki temu lufa nie obróci się poniżej poziomej linii podstawy.
Wskazówka
if (myVariable == 10) { myVariable = 20; } myVariable = 30; Po wykonaniu tych instrukcji, zmienna myVariable będzie zawsze przyjmowała wartość 30, nawet wtedy, gdy spełniony zostanie warunek myVariable == 10. Ostatnie wyrażenie jest wykonywane niezależnie od wszystkich innych wyrażeń.
|
Rys. 9.33. Lufa działa nie może obrócić się o kąt powyżej 90 stopni ponieważ wyrażenie if nie pozwala zmiennej rotation przyjmować wartości większych niż 90
|
|
Wprowadzanie alternatywy do wyrażeń warunkowych W wielu sytuacjach będzie zachodzić potrzeba wprowadzenia do wyrażenia warunkowego alternatywnego wyboru. Wyrażenie else pozwala na wykonanie konsekwencji warunku w momencie, kiedy nie jest on spełniony. Wyrażenie else było omówione w rozdziale 7., jako sposób na wykrycie upuszczonych klipów filmowych. W tamtym przykładzie wyrażenie if sprawdzało, czy klip filmowy został upuszczony w miejscu zajmowanym przez inny klip filmowy. Gdy warunek był spełniony, upuszczony klip znikał; w przypadku niespełnienia warunku, wyrażenie else odsyłało przeciągnięty klip filmowy do jego pierwotnej pozycji. Wyrażenie else odnosi się do wszystkich warunków niespełnionych w wyrażeniu if. Wyrażenie else zawsze towarzyszy wyrażeniu if, a jego składnia wygląda następująco: if (warunek) { konsekwencja1; } else { konsekwencja2; } Używaj instrukcji else w przypadku istnienia możliwości wyboru pomiędzy dwiema opcjami, np. przy detekcji kolizji, sprawdzaniu prawdziwości argumentu, poprawności odpowiedzi lub hasła.
|
Po wczytaniu tego klipu filmowego, zmienna zostanie zadeklarowana z wartością false (fałsz). Zwróć uwagę, że zawartość pola Value jest wyrażeniem, dlatego też false jest odczytywane jako zmienna boole'owska, a nie znakowa.
Po wciśnięciu przycisku wyboru zmienna przyjmie wartość true.
|
Rys. 9.34. Klip filmowy będący przyciskiem wyboru deklaruje zmienną answer (odpowiedź) z wartością boole'owską false (fałsz)
Rys. 9.35. Przycisk w stanie „wyłączony” zmienia wartość zmiennej answer na true (prawda)
|
Rys. 9.36. Przycisk w stanie „włączony” zmienia wartość zmiennej answer na false (fałsz)
Rys. 9.37. Przycisk sprawdza zmienną answer, osadzoną w klipie filmowym przycisku wyboru. Jeśli warunek jest spełniony, inny klip filmowy, o nazwie response (odpowiedź), przeskakuje do ujęcia wyświetlającego komunikat
Rys. 9.38. Wyrażenie else sprawia, że klip filmowy response przeskakuje do innego ujęcia w przypadku, gdy zmienna answer przyjmuje wartość false |
Ponowne kliknięcie przycisku (powodujące „wyłączenie” go) ustawia wartość zmiennej na false.
Wskazówka
|
Jeśli masz do czynienia z kilkoma możliwymi do spełnienia warunkami oraz odpowiadającą im liczbą konsekwencji, musisz posłużyć się jeszcze bardziej rozgałęzionymi wyrażeniami warunkowymi, niż te, które są dostępne przy używaniu wyrażenia else. W przypadku np. projektowania interfejsu witryny sieciowej lub gry, wymagającej wprowadzania danych z klawiatury, będziesz chciał zapewne sprawdzać, który klawisz został wciśnięty, a następnie wymuszać wykonanie akcji odpowiadającej temu konkretnemu klawiszowi. Za pomocą dostępnej we Flashu instrukcji else if możesz konstruować takie właśnie rozbudowane wyrażenia warunkowe wraz z odpowiadającymi im konsekwencjami. Składnia wygląda następująco: if (warunek1) { konsekwencja1; } else if (warunek2) { konsekwencja2; } else if (warunek3) { konsekwencja3; } Każde z wyrażeń else if posiada swój własny warunek, który jest szacowany, a także własny zestaw konsekwencji, wykonywanych w przypadku spełnienia warunku. W następnym ćwiczeniu wykorzystujemy obiekt Key oraz rozgałęzione wyrażenie warunkowe do przesunięcia i obrócenia klipu filmowego w sposób uzależniony od rodzaju wciśniętego klawisza.
|
|
Rys. 9.39. Po wciśnięciu klawisza strzałki w górę ten klip filmowy jest obracany o 0 stopni i przesuwany o 30 pikseli w górę sceny
|
W celu
Pierwszy warunek korzysta z metody isDown obiektu Key do sprawdzenia, czy wciśnięty został klawisz strzałki w górę.
W polu Value wpisz this._y - 30. Te dwie akcje setProperty obracają klip filmowy w ten sposób, że jego górna krawędź jest zwrócona do góry, po czym odejmują wartość 30 pikseli od współrzędnej y jego położenia, dzięki czemu klip przesuwa się po scenie. Zaznacz obydwa pola wyboru Expression (rys. 9.39).
|
Ta seria wyrażeń if oraz else if sprawdza, czy użytkownik wcisnął klawisz strzałki, a jeśli tak, to przesuwa klip filmowy stosownie do wciśniętego klawisza (rys. 9.40). Stworzyłeś zaczątek gry Frogger! Wskazówka
if (Key.isDown(Key.LEFT)) if (Key.isDown(Key.LEFT)==true)
|
Rys. 9.40. Kompletny skrypt (u dołu) zawiera cztery wyrażenia warunkowe z instrukcjami if i else if, sprawdzającymi, czy wciśnięto któryś z klawiszy strzałek (góra, lewo, prawo lub dół). Stopień obrotu i pozycja klipu filmowego (żuczek na rysunku u góry) zmieniają się w zależności od tego, który z warunków został spełniony
|
Rys. 9.41. Operator logiczny && łączy te dwa wyrażenia, w wyniku czego do spełnienia całego warunku niezbędne jest wciśnięcie jednocześnie dwóch klawiszy - strzałka w górę i strzałka w prawo
|
Łączenie wyrażeń warunkowych za pomocą operatorów logicznych Istnieje możliwość tworzenia złożonych wyrażeń warunkowych - za pomocą operatorów logicznych && (AND), || (OR) oraz ! (NOT). Operatory te łączą dwa lub więcej warunków w jednym wyrażeniu if, umożliwiając sprawdzanie bardziej skomplikowanych scenariuszy działań. Przykładem może być sprawdzanie, czy wciśnięto jednocześnie klawisze strzałki w górę oraz strzałki w prawo, z zamiarem przesunięcia klipu filmowego po skosie. Możliwe też byłoby sprawdzenie, na której spośród kilku możliwych pozycji upuszczony został przeciągany klip filmowy. Operator NOT można wykorzystać do sprawdzenia, czy zmienna zawiera ważny adres e-mail, ale jednocześnie taki, którego domena nie jest obwarowana zakazem dostępu. Poniższe ćwiczenie bazuje na pliku, który utworzyłeś wcześniej, w celu przesuwania klipu filmowego za pomocą klawiatury. Połączysz teraz dwa warunki w jednym wyrażeniu, dzięki czemu Flash będzie mógł sprawdzić wciśniętą kombinację klawiszy i w efekcie przesunąć klip filmowy po skosie. W celu połączenia warunków:
Obydwa warunki pojawią się w polu Condition, oddzielone operatorem &&.
|
Dzięki wprowadzeniu operatora logicznego && Flash będzie sprawdzał, czy użytkownik wcisnął kombinację dwóch klawiszy. Wskazówka
if (twójWiek >= 12) { if (twójWiek <=20) { status = "nastolatek"; } }
if (twójWiek >= 12 && twójWiek <=20) { status = "nastolatek"; }
|
Rys. 9.42. Pierwszy fragment skryptu wskazuje, że po wciśnięciu jednocześnie klawiszy strzałki w górę i strzałki w prawo żuczek wykona obrót o 45 stopni i przesunie się po skosie w kierunku prawo-góra
Rys. 9.43. Kompletny skrypt zawiera połączone warunki określające naciśnięcie kombinacji dwóch klawiszy, jak również warunki wystąpienia zdarzenia polegającego na wciśnięciu pojedynczego klawisza
|
|
Zapętlanie wyrażeń Zapętlając wyrażenia, możesz tworzyć akcje lub grupy akcji, które będą wykonywane określoną ilość razy, lub też dopóki spełniony będzie pewien warunek. Powtarzające się akcje są często wykorzystywane do budowania tablic, specjalnej odmiany zmiennych, przechowujących dane w strukturalny, łatwo dostępny sposób. Akcja wykonywana w pętli daje pewność, że każdy fragment danych jest wprowadzany i odczytywany w prawidłowej kolejności. Więcej o tablicach dowiesz się z rozdziału 11. Generalnie jednak, zapętlających się wyrażeń używa się do automatycznego wykonywania akcji przez ilość razy określaną za pomocą zmiennej o narastającej wartości. Taka zmienna modyfikuje argumenty każdej następnej metody w pętli albo określone właściwości tworzonych obiektów. Na przykład, możesz dynamicznie generować grafikę w całości za pośrednictwem ActionScript, powielając tylko klipy filmowe za pomocą wyrażeń i akcji duplicateMovieClip. Korzystaj z zapętlających się wyrażeń, gdy zachodzi potrzeba zmiany właściwości całej serii klipów filmowych, modyfikowania złożonych ustawień dźwięku lub wprowadzania zmian do wartości grupy zmiennych. Istnieją trzy rodzaje wyrażeń działających w pętli - akcje while, do while i for - ale wszystkie one mają to samo zastosowanie. Dwa pierwsze wykonują pętle, dopóki spełniony jest określony warunek. Trzecie wyrażenie wykonuje pętle, korzystając przy tym z wbudowanego licznika. W celu zastosowania wyrażenia while do powielania klipów filmowych:
|
Zmienna i lub j jest często używana w postaci licznika pętli.
|
Rys. 9.44. Zadeklaruj zmienną i dla manipulatora zdarzenia on (release)
Rys. 9.45. Klip filmowy bar jest powielany, obracany i otrzymuje nową wartość poziomu przezroczystości tak długo, jak długo zmienna I ma wartość mniejszą niż 361
Rys. 9.46. Klip filmowy bar (u góry) jest podstawą wzorku (w środku) wykreślonego przez wykonywane w pętli wyrażenie (u dołu) |
Rys. 9.47. Równoważne wyrażenie do while
Rys. 9.48. Równoważne wyrażenie for
Rys. 9.49. To ostrzegawcze okno dialogowe pojawia się, kiedy niespodziewanie próbujesz uruchomić nieskończoną pętlę
|
Wyrażenie do while Wyrażenie while (Esc + do) jest zbliżone do wyrażenia while, tyle że warunek jest tu sprawdzany na końcu pętli, a nie na początku. Oznacza to, że akcje w pętli są wykonywane co najmniej raz. Ten sam skrypt, który utworzyliśmy w poprzednim ćwiczeniu, można zapisać za pomocą wyrażenia do while, jak pokazano na rys. 9.47. Wyrażenie for Wyrażenie for (Esc + fr) udostępnia wbudowany licznik i parametry do zwiększania oraz zmniejszania jego zawartości, dzięki czemu możesz uniknąć pisania oddzielnych wyrażeń. Parametry wyrażenia for to: Init, deklarujące zmienną licznika, Condition, czyli sprawdzane wyrażenie, Next, określające wartość przyrostu lub zmniejszania się zmiennej licznika. Skrypt utworzony w poprzednim ćwiczeniu można zapisać również za pomocą wyrażenia for, jak widać na rys. 9.48. Wskazówki
|
Rozdział 9.
296
295
Kontrolowanie przepływu informacji
9
Kontrolowanie
przepływu informacji
Klip filmowy bar
Klip filmowy obrócony o 90 stopni
myMovieClip
Odtwarzanie mushroom3 zatrzymane w klatce 1.
X=100
Odtwarzanie mushroom2 zatrzymane w klatce 1.
Odtwarzanie mushroom1 zatrzymane w klatce 1.
frameNumber=5
Oryginalny klip filmowy tańczącego grzyba, nazwany mushroom
stop ( )
mushroom3 na poziomie głębokości = 3, x = 60
Akcja getURL, przypisana do przycisku wewnątrz klipu filmowego, odwołuje się do zmiennej _root.myURL
Zmienna myURL ograniczona zakresem działania do głównej listwy czasowej
Zmienna myURL osadzona w listwie czasowej klipu filmowego
Akcja getURL, przypisana do przycisku wewnątrz klipu filmowego, odwołuje się do zmiennej myURL
mushroom2 na poziomie głębokości = 2, x = 40
Oryginalny klip filmowy tańczącego grzyba, nazwany mushroom
mushroom1 na poziomie głębokości = 1, x = 20
Przycisk zwiększający wartość zmiennej
Przycisk zmniejszający wartość zmiennej
Klip filmowy obraca się w zależności od wartości zmiennej rotation
Przycisk
Duplikaty klipu filmowego bar
Kontrolowanie przepływu informacji
Deklarowanie danych
Deklarowanie danych
Deklarowanie danych
Deklarowanie danych
Deklarowanie danych
Wczytywanie zminnych z zewnątrz
Wczytywanie zminnych z zewnątrz
Modyfikowanie zmiennych
Wiązanie zmiennych i funkcja eval
Wiązanie zmiennych i funkcja eval
Sprawdzanie informacji
Wprowadzanie alternatywy
Wprowadzanie alternatywy
Rozgałęzianie wyrażeń warunkowych
Łączenie wyrażeń warunkowych
Zapętlanie wyrażeń
Zapętlanie wyrażeń
Deklarowanie danych
Deklarowanie danych
Deklarowanie danych
Deklarowanie danych
Deklarowanie danych
Deklarowanie danych
Wczytywanie zminnych z zewnątrz
Modyfikowanie zmiennych
Modyfikowanie zmiennych
Wiązanie zmiennych i funkcja eval
Sprawdzanie informacji
Sprawdzanie informacji
Wprowadzanie alternatywy
Rozgałęzianie wyrażeń warunkowych
Rozgałęzianie wyrażeń warunkowych
Łączenie wyrażeń warunkowych
Zapętlanie wyrażeń