r22-07.doc

(371 KB) Pobierz
Szablon dla tlumaczy

Rozdział 22.
Funkcje i tablice

W tym rozdziale:

·         Typy danych w ActionScript

·         Używanie funkcji w filmach Flasha

·         Tworzenie tablic, czyli elegancka organizacja danych

·         Tworzenie dynamicznego menu

 

Wiesz już teraz, jak pracować z podstawowymi danymi, jakimi są zmienne, możemy więc przystąpić do omawiania funkcji i tablic. W tym rozdziale poznasz typy danych, podprogramy, tablice oraz zaawansowane użycie funkcji.

Czym są typy danych?

We Flashu 4 dane w filmie nie miały wyraźnie określonych typów. Typ danych to pewna grupa klasyfikacyjna, do której należą określone dane. Niektórych typów danych nie można skonwertować do innych typów, natomiast inne mogą zostać przekonwertowane. Aby zilustrować typy danych, prześledzimy działający kod z filmu Flasha 4:

Set Variable: "sciezka1" = "/ballAnim/ballPath"

Set Variable: "sciezka2" = "/ballAnim"

Begin Tell Target (sciezka1)

  Stop

End Tell Target

Begin Tell Target (sciezka2)

  Stop

End Tell Target

W tym skrypcie mamy dwie zmienne Flasha 4, sciezka1 oraz sciezka2. Wartościami tych zmiennych są ścieżki adresowe do dwóch różnych klonów klipów filmowych, ballAnim oraz ballPath. We Flashu 4 mogliśmy użyć tych ścieżek jako ścieżek docelowych w akcji Tell Target. We Flashu 5 ten kod nadal działa:

sciezka1 = "_root.ballAnim.ballPath";

sciezka2 = "_root.ballAnim";

tellTarget(sciezka1){

  stop;

}

tellTarget(sciezka2){

  stop;

}

Ponieważ akcja tellTarget jest kompatybilna z Flashem 4, może obsługiwać wartości tekstowe (na przykład "_root.ballAnim.ballPath") jako ścieżki adresowe we Flashu 5. Jeśli jednak chcesz używać nowych metod obiektu typu Movie Clip do sterowania docelowym obiektem, wtedy sciezka1 oraz sciezka2 nie będą działać:

sciezka1 = "_root.ballAnim.ballPath";

sciezka2 = "_root.ballAnim";

sciezka1.stop();

sciezka2.stop();

Dlaczego? Dlatego, że zmienne te są wartościami tekstowymi i Flash 5 nie ma informacji, że reprezentują one ścieżki rzeczywistych obiektów. Trzeba usunąć cudzysłowy i napisać:

sciezka1 = _root.ballAnim.ballPath;

sciezka2 = _root.ballAnim;

sciezka1.stop();

sciezka2.stop();

Flash 5 otrzyma wiadomość, że w zmiennych sciezka1 oraz sciezka2 znajdują się ścieżki odnoszące się do obiektów ballPath oraz ballAnim. W tym momencie zastanawiasz się, jak użyć starej instrukcji eval(), aby skorzystać ze ścieżek dynamicznych klipów filmowych. We Flashu 4 mogłeś napisać:

Set Variable: "i" = 1;

Set Variable" "sciezka1" = "/ballAnim/ball_" + i;

Begin Tell Target (sciezka1)

  Stop

End Tell Target

We Flashu 5, jeśli chcesz, aby zmienna wskazywała obiekt typu Movie Clip, musisz przypisać jej obiekt (w sensie typu zmiennej). Jeśli chcesz to samo wykonać we Flashu 5 za pomocą metody, możesz zmienić powyższy skrypt na następujący:

i = 1;

sciezka1 = eval("_root.ballAnim.ball_" + i);

sciezka1.stop();

Flash 5 wyznaczy wartość wyrażenia "_ root.ballAnim.ball_" + i, którego wynikiem będzie "_ root.ballAnim.ball_1". W tym momencie Flash nie „wie” jeszcze, że ten ciąg znaków odnosi się do obiektu typu Movie Clip. Dopiero zastosowanie funkcji eval() powoduje zamianę wartości tekstowej na odnośnik obiektu, w tym wypadku klon klipu filmowego _root.ballAnim.ball_1.

Jednak funkcja eval() jest już trochę za stara, jak na Flasha 5. W poprzednim rozdziale omówiliśmy użycie operatora dostępu do elementów tablicy „[ ]”, aby ominąć funkcję eval(). W połączeniu ze zmiennymi operator ten może zostać użyty w celu odniesienia się do klipu filmowego:

i = 1;

_root.ballAnim["ball_" + i].stop();

Ten kod spowoduje połączenie ciągu znaków "ball_" z wartością zmiennej i oraz odniesienie się do obiektu ball_1 na listwie czasowej klonu klipu filmowego ballAnim.

Jak dotąd zobaczyliśmy dwa typy danych w działaniu: wartości tekstowe oraz obiekty. Jeśli wartość zmiennej znajduje się w cudzysłowach, na przykład "_root.ballAnim", wtedy jest traktowana jako wartość tekstowa. Jeśli wartość zmiennej jest obliczana lub bezpośrednio wskazuje jakiś obiekt, na przykład _root.ballAnim, wtedy Flash 5 traktuje ją jako obiekt. Flash 5 zawiera akcję typeof, która zwraca typ wyrażenia lub zmiennej podanej jako parametr. Omawiamy ją w dalszej części tej sekcji. Zanim się jej przyjrzymy, poznamy pięć typów danych z ActionScript Flasha 5.

Typ string — wartość tekstowa

Czytając tę książkę, wielokrotnie spotkałeś się z tym typem danych. Za każdym razem, kiedy coś jest zawarte w cudzysłowach, masz do czynienia z wartością tekstową. Jeśli w wyrażeniu występuje wartość tekstowa, to wynikiem całości także będzie wartość tekstowa. Wszystkie poniższe definicje dotyczą wartości tekstowych.

imie = "Franciszek";

nazwisko = "Nowak";

imiePlusNazwisko = imie + nazwisko;

koncowkaSciezki = "1";

Wskazówka! Wejściowe i dynamiczne pola tekstowe odpowiednio przyjmują i wyświetlają wartości tekstowe. Jeśli chcesz przeprowadzić obliczenia na wartościach pochodzących z pól tekstowych, upewnij się, że wcześniej skonwertujesz je na liczby. Typ danych liczbowych omawiamy za chwilę.

Jeśli zmienna jest wartością tekstową, możesz przetwarzać ją za pomocą metod obiektu String. Na przykład, jeśli chcesz zamienić wszystkie znaki zmiennej imie na wielkie litery (na przykład zamienić „Franciszek” na „FRANCISZEK”), możesz użyć poniższego skryptu:

imie = "Franciszek";

imie = imie.toUpperCase();

W tym wypadku metoda toUpperCase() powoduje w ciągu znaków zamianę wszystkich małych liter na wielkie. Możesz także w podobny sposób wyekstrahować pewne informacje z tekstu. Jeśli na przykład chcesz się dowiedzieć, gdzie w tekście pojawia się znak spacji i zwrócić ciąg znaków od spacji do końca tekstu, możesz użyć następującego skryptu:

wersja = "Netscape 4.71";

poczatek = wersja.indexOf(" ") + 1;

wersja = wersja.slice(poczatek, -1);

trace("Wersja = " + wersja);

W powyższym kodzie metoda indexOf() szuka pierwszego wystąpienia spacji (" ") w wartości tekstowej zmiennej wersja. Metoda indexOf(" ") zastosowana wobec zmiennej wersja zwróci indeks znaku spacji (indeks jest numerem znaku w ciągu, przy czym pierwszy znak ciągu ma indeks zerowy). W tym wypadku zwróci wartość 9. Następnie do wartości zwróconej przez tę metodę dodajemy 1, więc uzyskamy indeks 10, wskazujący w ciągu znaków w zmiennej wersja na znak „4”. Tak obliczony indeks przypisujemy pomocniczej zmiennej poczatek. Następnie za pomocą metody slice() pobieramy wszystkie znaki tekstu, począwszy od znaku wskazywanego przez poczatek (czyli znaku o indeksie 10). Parametr –1 powoduje, że ostatni zwracany znak pokrywa się z końcem tekstu. Zauważ, że po zakończeniu skryptu w zmiennej wersja znajdzie się tekst „4.71”.

Odsyłacz! Więcej informacji na temat metod obiektu typu String i przetwarzania wartości tekstowych znajdziesz na stronach 376–383 książki ActionScript Reference Guide.

Typ number — liczby

Tego typu daną jest każda liczba (lub wartość wyrażenia liczbowego). Wszelkie operacje matematyczne są przeprowadzane na wartościach liczbowych.

wiek = "27";

przyszleLata = "5";

wiek = wiek + przyszleLata;

trace("Za " + przyszleLata + " lat będę miał " + wiek + " lat(a).");

Po wpisaniu tego skryptu i uruchomieniu filmu w oknie Output zobaczysz następujący komunikat:

Za 5 lat będę miał 275 lat(a).

Niestety, nie takiego wyniku się spodziewaliśmy. Ponieważ zmienne wiek oraz przyszleLata zostały określone jako tekst (ze względu na cudzysłowy), Flash po prostu połączył obydwa teksty i dlatego otrzymaliśmy „275”. Aby wszystko działało tak, jakbyśmy tego chcieli, musimy odrobinę zmodyfikować skrypt:

wiek = 27;

przyszleLata = 5;

wiek = wiek + przyszleLata;

trace("Za " + przyszleLata + " lat będę miał " + wiek + " lat.");

Teraz wartości zmiennych wiek oraz przyszleLata są wartościami liczbowymi. Operacja matematyczna spowoduje dodanie obydwu liczb (a nie ich połączenie). W oknie Output pojawi się następujący komunikat:

Za 5 lat będę miał 32 lat(a).

Możesz używać funkcji Number() do zamiany tekstu na liczbę. W skrypcie z poprzedniej sekcji moglibyśmy przekształcić uzyskany tekst na liczbę, dopisując następującą linię:

wersja = Number(wersja);

Dzięki temu możemy wykorzystać tę zmienną do obliczeń matematycznych, ponieważ wartość „4.71” została zamieniona na wartość 4,71.

Typ boolean — wartość logiczna

Czasami przydaje się zmienna, która może przyjmować tylko dwie wartości: true (prawda) lub false (fałsz). Zmienne takie nazywane są zmiennymi logicznymi. Wartości logiczne przydają się przy podejmowaniu decyzji lub przełączaniu — na przykład światło może być załączone albo wyłączone. W poniższym kodzie zmienna ladowanie inicjalizowana jest wartością true, ale po zakończeniu ładowania przełączana jest na false:

onClipEvent(load){

  _root.ladowanie = true;

  trace("Typ zmiennej ladowanie = " + typeof(_root.ladowanie));

}

onClipEvent(enterFrame){

  if(this._framesloaded >= this._totalFrames){

    _root.ladowanie = false;

  }

}

Ten skrypt możemy umieścić w klonie klipu filmowego (jako skrypt obiektu). Kiedy klon klipu filmowego pojawi się na scenie, rozpocznie się ładowanie, a w oknie Output pojawi się komunikat:

Typ zmiennej ladowanie = boolean

Typ movieclip — obiekt typu Movie Clip

Klony klipów filmowych na obrazie są danymi typu movieclip. Dzięki operatorowi typeof możesz łatwo sprawdzić, jakiego typu są zadeklarowane zmienne lub obiekty. Flash odróżnia obiekty klipów filmowych od innych obiektów, więc dużo łatwiej wykryć obiekt typu Movie Clip. Zadeklarowana poniżej zmienna będzie typu movieclip:

sciezka = _root.ballAnim;

Dopóki klon klipu filmowego o nazwie ballAnim istnieje na głównej listwie czasowej, typem zmiennej sciezka będzie movieclip. Jeśli ballAnim nie istnieje, typ zmiennej zostanie określony jako undefined (niezdefiniowany).

Typ object

Ten typ dotyczy każdego obiektu utworzonego w skrypcie. Na przykład w poprzednich rozdziałach używaliśmy obiektów typu Color oraz Sound, aby wzbogacić interaktywne prezentacje. Zdefiniowane poniżej zmienne będą typu object:

kolor = new Color(_root.ballAnim);

dzwiek = new Sound();

obiekt = new Object();

Jeśli użyjesz tego kodu w filmie Flasha, zobaczysz typ object w oknie Output po wykonaniu polecenia Debug/List Variables w środowisku testowym:

Level #0:

  Variable _level0.$version = "MAC 5,0,30,0"

  Variable _level0.kolor = [object #1] {}

  Variable _level0.dzwiek = [object #2] {}

  Variable _level0.obiekt = [object #3] {}

Movie Clip:  Target="_level0.ballAnim"

Typ function

W skryptach Flasha 5 możesz definiować własne funkcje. W dalszej części tego rozdziału omawiamy podprogramy oraz akcję function. Typ function zostanie przypisany w skrypcie każdemu kodowi, który zaczyna się od akcji function, na przykład:

function idzDo(etykieta){

  gotoAndStop(etykieta);

}

Typ undefinied

Przy sprawdzaniu typu nieistniejącej w skrypcie zmiennej lub obiektu, Flash 5 zwraca typ undefined.

Sprawdzanie typu zmiennej za pomocą operatora typeof

Teraz, kiedy znasz już typy danych występujących we Flashu 5, będziesz zapewne chciał poznać sposób sprawdzania typu określonej informacji. Za pomocą operatora typeof możesz poznać typ określonego elementu skryptu. Operator typeof przyjmuje tylko jeden parametr: nazwę elementu skryptu, który chcesz przetestować. Na przykład możesz wyświetlić typ zmiennej (bądź obiektu) w oknie Output:

imie = "Robert";

trace("imie jest typu " + typeof(imie));

Po przetestowaniu filmu w oknie Output pojawi się tekst:

imie jest typu string

Możesz używać operatora typeof w pętlach for...in, dzięki czemu akcje zagnieżdżone wewnątrz pętli będą wykonywane tylko dla określonego typu danych. Poniższy skrypt spowoduje przeniesienie wszystkich zmiennych tekstowych z głównej listwy czasowej do obiektu (lub klonu klipu filmowego) o nazwie globalVar (znak ¬ oznacza kontynuację tej samej linii kodu; nie umieszczaj go w rzeczywistym skrypcie):

for(varName in _root){

if(typeof(_root[varName]) == "string" && ¬

_root[varName] !=_root["$version"]){

_root.globalVar[varName] = _root[varName];

delete _root[varName];

   }

}

Powyższy kod spowoduje przeniesienie wszystkich zmiennych (poza automatyczną zmienną $version) do klonu klipu filmowego (lub obiektu) o nazwie globalVar.

Na CD-ROM-ie! Przetestuj filmy typeof_simple.fla, typeof_advanced.fla oraz moveVariables.fla znajdujące się w katalogu ch22 na CD-ROM-ie.

Funkcje jako podprogramy

Podstawowym blokiem kodu wykorzystywanym przez każdy język programowania jest podprogram. To kod, który przeznaczasz do określonych zadań. Podprogram jest bardzo przydatny, kiedy chcesz tych samych akcji używać w kilku miejscach (na przykład klonach przycisków lub ujęciach). We Flashu podprogramy są nazywane funkcjami i powstają za pomocą akcji function.

Co robią funkcje?

Funkcja (lub podprogram) powoduje oznaczenie pewnego fragmentu kodu tak, aby wywoływać go po umieszczeniu w skrypcie tylko jego nazwy. Funkcja może powodować wykonanie kilku akcji i przekazywać parametry (nazywane argumentami) do tych akcji. Funkcje muszą mieć różne nazwy, abyś później wiedział, do jakiego zestawu akcji się odwołujesz. W zasadzie funkcje mogą posłużyć do definiowania własnych, dodatkowych „poleceń” języka ActionScript. We Flashu 4 używaliśmy akcji call, aby wykonać kod znajdujący się w innym ujęciu filmu. We Flashu 5 możemy utworzyć funkcję na określonej listwie czasowej i wykonać ją, wpisując ścieżkę adresową oraz nazwę funkcji.

Kiedy tworzyć funkcję?

Osobom dopiero zaczynającym pisać skrypty duży problem sprawia to, kiedy należy tworzyć funkcje w filmie Flasha. Poniższe wskazówki pozwolą Ci zorientować się, kiedy powinieneś utworzyć funkcję.

·         Jeśli spostrzeżesz, że tego samego fragmentu kodu używasz w skryptach kilku klonów przycisków, klipów filmowych lub ujęć, wtedy powinieneś rozważyć umieszczenie powtarzających się akcji w funkcji. Zwykle nie powinieneś gromadzić całego kodu w pojedynczym klonie przycisku lub ujęciu.

·         Gdy musisz przeprowadzać te same operacje w różnych częściach filmu, na przykład ukrywać określony klon klipu filmowego na scenie, wtedy powinieneś rozważyć jednorazowe utworzenie funkcji, która później zajmie się wszystkim za Ciebie.

·         Jeśli do określenia jakiejś wartości używasz skomplikowanych operacji matematycznych, powinieneś je umieścić w funkcji.

Jak zdefiniować funkcję?

Gdy dodajesz funkcję do ujęcia głównej listwy czasowej lub listwy czasowej klipu filmowego, mówimy o definiowaniu funkcji. Funkcję, podobnie jak inne obiekty, możesz wywołać za pomocą ścieżki adresowej. Każda funkcja po swojej nazwie musi posiadać dwa nawiasy (otwierający i zamykający), jednak argumenty (parametry przekazywane do funkcji) znajdujące się wewnątrz nawiasów nie są wymagane.

Wskazówka! Funkcje zwykle definiuje się na samym początku filmu (lub wewnątrz klonu klipu filmowego ładowanego w pierwszym ujęciu filmu). Powinieneś umieszczać funkcje tylko w ujęciach listew czasowych — możesz jednak wywołać je z każdego detektora zdarzeń we Flashu.

Przypuśćmy, że chcesz utworzyć funkcję, która będzie zawierała tylko jedną akcję — gotoAndStop(). Jej nazwa będzie krótsza niż gotoAndStop()...

Zgłoś jeśli naruszono regulamin