SlideShare a Scribd company logo
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI    ActionScript. Przewodnik
                                          encyklopedyczny
           KATALOG KSI¥¯EK
                                          Autor: Colin Moock
                      KATALOG ONLINE      T³umaczenie: Marek Binkowski, Ryszard Glego³a,
                                          Bohdan G³êbocki, Rafa³ Joñca, Joanna Pasek,
       ZAMÓW DRUKOWANY KATALOG            Wojciech Pazdur
                                          ISBN: 83-7197-903-7
                                          Tytu³ orygina³u: ActionScript The Definitive Guide
              TWÓJ KOSZYK                 Format: B5, stron: 760

                    DODAJ DO KOSZYKA     Flash jest ju¿ standardem dla sieciowych multimediów, dostêpnych dla ponad 250
                                         milionów u¿ytkowników na ca³ym wiecie. Ksi¹¿ka „ActionScript. Przewodnik
                                         encyklopedyczny” to pe³na dokumentacja jêzyka ActionScript — zorientowanego
         CENNIK I INFORMACJE             obiektowo jêzyka programowania, bêd¹cego podstawowym narzêdziem tworzenia
                                         zaawansowanych witryn internetowych dla programistów Flasha. Jest kierowana zarówno
                   ZAMÓW INFORMACJE      do projektantów i grafików, którzy dopiero ucz¹ siê programowania, jak i do programistów
                     O NOWO CIACH        JavaScript, którzy chc¹ przenie æ swoje umiejêtno ci na jêzyk ActionScript (oba te jêzyki
                                         opieraj¹ siê na tym samym standardzie ECMAScript).
                       ZAMÓW CENNIK      Colin Moock nieraz ju¿ dowiód³ umiejêtno ci przekazywania swojej szerokiej wiedzy
                                         w praktyczny i przystêpny sposób. W pe³ni zas³u¿y³ sobie na uznanie, jakim darz¹ go
                                         u¿ytkownicy Flasha.
                 CZYTELNIA               W pierwszej czê ci ksi¹¿ki opisano podstawowe zagadnienia programistyczne (zmienne,
                                         typy danych, operatory, wyra¿enia, funkcje, zdarzenia, tablice i obiekty), po wiêcaj¹c du¿o
          FRAGMENTY KSI¥¯EK ONLINE       uwagi ich wykorzystaniu, szczególnie w obróbce klipów filmowych. Druga czê æ jest
                                         po wiêcona typowym zastosowaniom ActionScriptu, takim jak przetwarzanie formularzy
                                         sieciowych. Trzecia czê æ, stanowi¹ca leksykon jêzyka, zawiera opis zmiennych
                                         globalnych, w³a ciwo ci, metod, detektorów zdarzeñ i obiektów wraz z przyk³adami ich
                                         u¿ycia.
                                         Korzystaj¹c z tej ksi¹¿ki szybko opanujesz jêzyk ActionScript. Prócz teorii znajdziesz tu
                                         praktyczne wskazówki i przyk³ady prezentuj¹ce tworzenie pól tekstowych, przycisków
                                         menu, quizów, witryn opartych o dokumenty XML, gier, w których obowi¹zuj¹ zasady
                                         praw fizyki, rodowisk dla wielu u¿ytkowników dzia³aj¹cych w czasie rzeczywistym i wielu
                                         innych. Skrupulatne opisy poruszaj¹ wiele nieudokumentowanych lub niezbadanych
                                         dotychczas tematów.
Wydawnictwo Helion                       „Najlepsza ksi¹¿ka o jêzyku ActionScript, jak¹ widzia³em. Trudno znale æ gdzie indziej
ul. Chopina 6                            wiêcej informacji na temat tego jêzyka”.
44-100 Gliwice
                                         — Slavik Lozben, g³ówny in¿ynier Flasha w firmie Macromedia
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treści

   Słowo wstępne.................................................................................................. 13

   Wstęp ................................................................................................................ 17

Część I Podstawy ActionScript.........................................................23
   Rozdział 1. Jeżeli nie jesteś programistą... ..................................................... 25
       Kilka podstawowych zwrotów ............................................................................................. 27
       Następne pojęcia ActionScript............................................................................................... 36
       Budujemy quiz ...................................................................................................................... 44
       Naprzód! ............................................................................................................................... 58

   Rozdział 2. Zmienne......................................................................................... 59
       Tworzenie zmiennych (deklaracja)........................................................................................ 60
       Przypisywanie zmiennym wartości ...................................................................................... 62
       Zmienianie i używanie wartości zmiennych ......................................................................... 63
       Typy wartości........................................................................................................................ 65
       Zakres zmiennej .................................................................................................................... 67
       Kilka praktycznych przykładów ........................................................................................... 78
       Naprzód! ............................................................................................................................... 79

   Rozdział 3. Dane i typy danych ...................................................................... 81
       Dane kontra informacje ......................................................................................................... 81
       Znaczenie zależne od typu danych ....................................................................................... 82
4                                                                                                                                  Spis treści


        Tworzenie i kategoryzacja danych ........................................................................................ 83
        Konwersja typów danych...................................................................................................... 85
        Dane proste i dane złożone ................................................................................................... 94
        Naprzód! ............................................................................................................................... 95

    Rozdział 4. Proste typy danych....................................................................... 97
        Typ liczbowy ......................................................................................................................... 97
        Liczby całkowite i liczby zmiennoprzecinkowe .................................................................... 97
        Liczbowe wyrażenia proste................................................................................................... 98
        Korzystanie z liczb w skryptach ActionScript..................................................................... 102
        Typ łańcuchowy .................................................................................................................. 103
        Korzystanie z łańcuchów w skryptach ActionScript........................................................... 108
        Typ logiczny ........................................................................................................................ 126
        Typ niezdefiniowany........................................................................................................... 129
        Typ pusty, czyli null............................................................................................................ 130
        Naprzód! ............................................................................................................................. 130

    Rozdział 5. Operatory.................................................................................... 131
        Ogólne cechy operatorów ................................................................................................... 131
        Operator przypisania .......................................................................................................... 135
        Operatory arytmetyczne ..................................................................................................... 136
        Operatory równości i nierówności ...................................................................................... 140
        Operatory porównania ........................................................................................................ 145
        Operatory działające na łańcuchach .................................................................................... 149
        Operatory logiczne .............................................................................................................. 149
        Operator grupowania.......................................................................................................... 155
        Przecinek jako operator....................................................................................................... 156
        Operator void ...................................................................................................................... 156
        Inne operatory ..................................................................................................................... 157
        Naprzód! ............................................................................................................................. 160

    Rozdział 6. Polecenia ..................................................................................... 161
        Typy poleceń ....................................................................................................................... 162
        Składnia poleceń.................................................................................................................. 162
        Polecenia ActionScript......................................................................................................... 164
        Polecenia i akcje................................................................................................................... 172
        Naprzód! ............................................................................................................................. 172
Spis treści                                                                                                                                       5


   Rozdział 7. Konstrukcje warunkowe............................................................. 173
       Konstrukcja if ...................................................................................................................... 174
       Konstrukcja else .................................................................................................................. 176
       Konstrukcja else if ............................................................................................................... 177
       Symulacja konstrukcji switch .............................................................................................. 178
       Składnia krótkich konstrukcji warunkowych...................................................................... 180
       Naprzód! ............................................................................................................................. 180

   Rozdział 8. Pętle ............................................................................................ 181
       Pętla while ........................................................................................................................... 181
       Terminologia pętli ............................................................................................................... 184
       Pętla do-while...................................................................................................................... 186
       Pętla for ............................................................................................................................... 187
       Pętla for-in ........................................................................................................................... 188
       Przedwczesne zatrzymanie pętli ......................................................................................... 189
       Pętle na listwie czasowej i pętle przypisane do zdarzeń klipów filmowych ...................... 192
       Naprzód! ............................................................................................................................. 199

   Rozdział 9. Funkcje ........................................................................................ 201
       Tworzenie funkcji ................................................................................................................ 202
       Uruchamianie funkcji .......................................................................................................... 202
       Przekazywanie informacji funkcjom ................................................................................... 203
       Opuszczanie funkcji i zwracane przez funkcje wartości ..................................................... 207
       Funkcje jako wyrażenia proste ............................................................................................ 209
       Dostępność funkcji i jej trwałość ......................................................................................... 210
       Zakres funkcji ...................................................................................................................... 211
       Jeszcze kilka słów o argumentach funkcji ........................................................................... 215
       Funkcje rekurencyjne........................................................................................................... 219
       Funkcje standardowe .......................................................................................................... 221
       Funkcje jako obiekty............................................................................................................ 222
       Wszystkie skrypty w jednym miejscu................................................................................. 223
       Stary quiz po nowemu ........................................................................................................ 224
       Naprzód! ............................................................................................................................. 227

   Rozdział 10. Zdarzenia i moduły obsługi zdarzeń ....................................... 229
       Synchroniczne wykonanie kodu ......................................................................................... 229
       Asynchroniczne wykonanie kodu oparte na zdarzeniach................................................... 230
       Rodzaje zdarzeń .................................................................................................................. 230
       Procedury obsługi zdarzeń ................................................................................................. 231
6                                                                                                                                  Spis treści


        Składnia procedur obsługi zdarzeń..................................................................................... 231
        Tworzenie procedur obsługi zdarzeń ................................................................................. 232
        Zasięg procedur obsługi zdarzeń ........................................................................................ 235
        Zdarzenia dla przycisków ................................................................................................... 239
        Przegląd zdarzeń klipów filmowych................................................................................... 243
        Zdarzenia klipowe związane z odtwarzaniem filmu .......................................................... 244
        Klipowe zdarzenia generowane przez użytkownika .......................................................... 250
        Kolejność wykonywania...................................................................................................... 255
        Kopiowanie procedur obsługi zdarzeń klipowych ............................................................. 257
        Odświeżanie ekranu przy użyciu updateAferEvent........................................................... 258
        Dynamiczne procedury obsługi zdarzeń klipów filmowych .............................................. 259
        Zastosowanie procedur obsługi zdarzeń ............................................................................ 260
        Naprzód! ............................................................................................................................. 262

    Rozdział 11. Tablice ....................................................................................... 263
        Czym jest tablica?................................................................................................................ 263
        Anatomia tablicy ................................................................................................................. 264
        Jak tworzymy tablice? ......................................................................................................... 265
        Odwołujemy się do elementów tablicy ............................................................................... 268
        Rozmiar tablicy.................................................................................................................... 270
        Elementy indeksowane nazwami........................................................................................ 272
        Dodajemy elementy do tablicy............................................................................................ 273
        Usuwamy elementy z tablicy .............................................................................................. 278
        Przetwarzanie zawartości tablic .......................................................................................... 282
        Tablice wielowymiarowe .................................................................................................... 287
        Quiz z pytaniami do wyboru, ujęcie 3. ............................................................................... 288
        Naprzód! ............................................................................................................................. 289

    Rozdział 12. Obiekty i klasy ......................................................................... 291
        Anatomia obiektu................................................................................................................ 294
        Tworzymy instancje obiektów ............................................................................................ 295
        Właściwości obiektów ......................................................................................................... 296
        Metody ................................................................................................................................ 297
        Klasy i programowanie zorientowane obiektowo .............................................................. 301
        Standardowe obiekty i klasy języka ActionScript ............................................................... 316
        Naprzód! ............................................................................................................................. 318
Spis treści                                                                                                                                     7


   Rozdział 13. Klipy filmowe ........................................................................... 319
       „Obiektowość” klipów filmowych ...................................................................................... 320
       Typy klipów filmowych ...................................................................................................... 321
       Tworzymy klipy filmowe.................................................................................................... 324
       Kolejność filmów i klonów w stosie.................................................................................... 331
       Odwołania do klonów oraz filmów głównych.................................................................... 338
       Usuwamy klony klipów i całe filmy ................................................................................... 351
       Standardowe właściwości klipów filmowych ..................................................................... 354
       Metody klipów filmowych .................................................................................................. 355
       Praktyczne zastosowania klipów filmowych ...................................................................... 360
       Quiz: ostatnia odsłona......................................................................................................... 364
       Naprzód! ............................................................................................................................. 367

   Rozdział 14. Struktura leksykalna ................................................................ 369
       Białe spacje .......................................................................................................................... 369
       Zakończenia instrukcji (średniki) ........................................................................................ 370
       Komentarze ......................................................................................................................... 372
       Słowa kluczowe................................................................................................................... 373
       Identyfikatory...................................................................................................................... 374
       Rozróżnianie wielkości liter ................................................................................................ 375
       Naprzód! ............................................................................................................................. 376

   Rozdział 15. Tematy zaawansowane ............................................................ 377
       Kopiowanie, porównywanie i przekazywanie danych ....................................................... 377
       Wykorzystywanie operacji na bitach................................................................................... 380
       Zagadnienia związane z zakresem funkcji.......................................................................... 390
       Typ danych „klip filmowy” ................................................................................................ 392
       Naprzód! ............................................................................................................................. 392


Część II ActionScript w praktyce ................................................... 393
   Rozdział 16. ActionScript; środowisko pracy............................................... 395
       Panel Actions....................................................................................................................... 395
       Umieszczanie skryptów w klatkach.................................................................................... 398
       Umieszczanie skryptów w przyciskach .............................................................................. 399
       Umieszczanie skryptów w klipach filmowych.................................................................... 400
       Gdzie jest kod? .................................................................................................................... 401
       Efektywność pracy .............................................................................................................. 402
8                                                                                                                                 Spis treści


        Korzystanie z zewnętrznych skryptów ............................................................................... 403
        Klipy filmowe typu Smart Clip ........................................................................................... 405
        Naprzód! ............................................................................................................................. 413

    Rozdział 17. Interaktywne formularze.......................................................... 415
        Obieg danych w formularzu Flasha .................................................................................... 415
        Tworzenie interaktywnego formularza............................................................................... 418
        Naprzód! ............................................................................................................................. 424

    Rozdział 18. Pola tekstowe ........................................................................... 425
        Dynamiczne pola tekstowe ................................................................................................. 425
        Wejściowe pola tekstowe .................................................................................................... 427
        Opcje pól tekstowych .......................................................................................................... 428
        Właściwości pól tekstowych ............................................................................................... 432
        Obsługa języka HTML ........................................................................................................ 434
        Zaznaczanie fragmentów tekstów w polach tekstowych.................................................... 442
        Puste pola tekstowe i pętla for-in........................................................................................ 442
        Naprzód! ............................................................................................................................. 443

    Rozdział 19. Usuwanie błędów...................................................................... 445
        Narzędzia do wyszukiwania błędów.................................................................................. 446
        Zasady testowania programów........................................................................................... 451
        Naprzód! ............................................................................................................................. 455


Część III Leksykon ........................................................................... 457

Dodatki ............................................................................................. 713
    Dodatek A Flash w Internecie ....................................................................... 715

    Dodatek B Zakres i kody znaków kodowania Latin 1................................ 719

    Dodatek C Zgodność z poprzednimi wersjami ............................................. 731

    Dodatek D Różnice między ActionScript a ECMA-262 i JavaScript .......... 737

    Skorowidz ....................................................................................................... 741
10
                                            Zdarzenia i moduły
                                               obsługi zdarzeń

Dowiedzieliśmy się sporo o pisaniu instrukcji wykonywanych przez interpreter Action-
Script. Potrafimy już prawidłowo powiedzieć interpreterowi co chcemy zrobić, ale jak
przekazać mu, kiedy wykonać te operacje? Kod ActionScript nie wywołuje się tak po
prostu sam z siebie — coś zawsze powoduje jego wykonanie.

Tym „czymś” może być zarówno synchroniczne odtwarzanie filmu, jak również prede-
finiowane asynchroniczne zdarzenia.


Synchroniczne wykonanie kodu
Podczas odtwarzania filmu wskaźnik odtwarzania przemieszcza się od klatki do klatki.
Za każdym razem gdy dociera do nowej klatki, interpreter wykonuje kod dołączony do
niej. Po wykonaniu kodu następuje odświeżenie ekranu oraz odtworzenie dźwięku.
Później wskaźnik przechodzi do następnej klatki.

Na przykład jeśli umieścimy kod w klatce 1., zostanie on wykonany, zanim klatka będzie
wyświetlona. Jeśli kolejny blok kodu umieścimy w klatce 5. (będącej klatką kluczową)
w tym samym filmie, to najpierw zostaną wyświetlone klatki od 1. do 4., następnie będzie
wykonany kod zawarty w klatce 5., po czym zostanie ona wyświetlona. Kolejność wy-
konywania kodu w klatkach 1. oraz 5. nazywamy synchroniczną, ponieważ następuje
w sposób liniowy, wynikający z kolejności klatek na listwie czasu.

Cały kod przypisany do klatek w filmie jest wykonywany synchronicznie. Nawet jeśli
niektóre klatki nie są odtwarzane w kolejności z powodu instrukcji gotoAndPlay( ) lub
gotoAndStop( ), kod związany z każdą klatką jest wykonywany w przewidywalnym po-
rządku związanym z ruchem wskaźnika odtwarzania.
230                                        Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


Asynchroniczne wykonanie kodu
oparte na zdarzeniach
Niektóre części kodu nie są wykonywane w przewidywalnej kolejności. Ich wykonanie
następuje, kiedy interpreter ActionScript wykryje, że miało miejsce jedno z predefinio-
wanych zdarzeń. Wiele zdarzeń jest związanych z określonymi działaniami użytkownika
(jak kliknięcie myszą czy naciśnięcie klawisza na klawiaturze). Tak jak głowica odtwa-
rzająca, docierając do klatki, wywołuje kod z nią związany, tak samo wystąpienie zda-
rzeń powoduje wykonanie kodu związanego ze zdarzeniami. Kod oparty na zdarzeniach
(czyli taki, który jest wykonywany po wystąpieniu zdarzenia) jest określany jako wyko-
nywany asynchronicznie, ponieważ jego uruchomienie nie następuje w określonym mo-
mencie filmu, a raczej w momencie, w którym wystąpi określone zdarzenie.

Programowanie synchroniczne wymaga na początek ustalenia czasu wykonywania kodu.
Natomiast programowanie asynchroniczne pozwala dynamicznie reagować na zachodzące
zdarzenia. Asynchroniczne wykonywanie kodu ma kluczowe znaczenie dla ActionScript
i dla tworzenia interaktywności.

W rozdziale tym znajdziesz wiadomości na temat tworzenia kodu opartego na zdarzeniach
oraz zestawienie różnych predefiniowanych zdarzeń, obsługiwanych przez ActionScript.


Rodzaje zdarzeń
Teoretycznie zdarzenia możemy podzielić na dwa rodzaje:
zdarzenia użytkownika
   wywoływane przez działania użytkownika (kliknięcie myszą lub naciśnięcie klawisza),
zdarzenia systemowe
   będące wynikiem odtwarzania filmu (pojawienie się klipu filmowego na scenie lub
   załadowanie z zewnętrznego pliku serii zmiennych).

W ActionScript nie ma różnic syntaktycznych między zdarzeniami użytkownika a zda-
rzeniami systemowymi. Zdarzenia systemowe są mniej ewidentne niż klinięcie myszą
przez użytkownika. Chociaż moglibyśmy nie traktować na przykład usunięcia klipu fil-
mowego ze sceny jako pełnoprawnego zdarzenia, to jednak możliwość reagowania na
zdarzenia systemowe daje poważne narzędzie kontroli odtwarzania filmu.

Zdarzenia w ActionScript mogą być również podzielone bardziej praktycznie ze względu
na obiekty, do których są przypisane. Wszystkie zdarzenia występują w powiązaniu
z określonymi obiektami w środowisku Flasha. Interpreter nie uważa, że „użytkownik
kliknął”, lecz „użytkownik kliknął ten przycisk” lub „użytkownik kliknął, kiedy ten klip
filmowy znajdował się na scenie”. I podobnie interpreter nie stwierdza: „otrzymano dane”,
lecz „ten klip filmowy otrzymał jakieś dane”. Tak więc opisujemy kod odpowiadający na
zdarzenia za pomocą obiektów, do których te zdarzenia są przypisane.
Składnia procedur obsługi zdarzeń                                                           231


Obiekty ActionScript, które mogą odbierać zdarzenia to:
• klipy filmowe,
• przyciski,
• obiekty klas XML oraz XMLSocket.

W tym rozdziale dowiemy się, że ActionScript w rzeczywistości posiada dwie różne imple-
mentacje obsługi zdarzeń: jedną dla zdarzeń związanych z klipami filmowymi i przyci-
skami oraz drugą skojarzoną ze wszystkimi pozostałymi rodzajami obiektów.


Procedury obsługi zdarzeń
Nie każde zdarzenie powoduje wykonanie kodu. Zdarzenia często mają miejsce bez jakie-
gokolwiek wpływu na odtwarzanie filmu. Przykładowo użytkownik może generować
dziesiątki zdarzeń, klikając raz za razem przycisk, ale te kliknięcia będą ignorowane.
Dlaczego? Ponieważ zdarzenia same nie mogą tworzyć kodu — to my musimy napisać
najpierw kod odpowiadający na zdarzenie. Aby powiadomić interpreter, by wykonał kod
w odpowiedzi na zdarzenie, musimy dodać do niego procedurę obsługi zdarzenia (event
handler) opisującą akcję, która ma zostać podjęta.

Procedura obsługi zdarzenia jest czymś w rodzaju specjalnie nazwanej funkcji, która jest
wykonywana automatycznie, kiedy dane zdarzenie ma miejsce. W związku z tym two-
rzenie procedur obsługi zdarzeń jest bardzo podobne do tworzenia funkcji, jednak z kil-
koma różnicami.
• Procedury obsługi zdarzeń mają predefiniowane nazwy, takie jak na przykład keyDown.
  Nie można nazwać procedury obsługi zdarzenia dowolnie, należy użyć jednej z tych
  predefiniowanych nazw. Pełna lista nazw procedur obsługi zdarzeń znajduje się
  w tabeli 10.1 oraz 10.2.
• Procedury obsługi zdarzeń nie są deklarowane za pomocą słowa kluczowego function.
• Procedury obsługi zdarzeń muszą być przypisane do przycisków, klipów filmowych
  lub innych obiektów, a nie do klatek.


            Większość zdarzeń została po raz pierwszy wprowadzona we Flashu 5. Jeżeli
            eksportujemy film do formatu Flash 4, korzystajmy tylko z procedur obsługi zdarzeń
            związanych z przyciskami (bo tylko one są obsługiwane przez Flash 4) i testujmy
            dokładnie nasz film w odtwarzaczu Flash Player 4.



Składnia procedur obsługi zdarzeń
Nazwy zdarzeń (a co za tym idzie, odpowiadających im procedur) są predefiniowane
w ActionScript. Procedury obsługi zdarzeń przyciskowych są definiowane przy użyciu
wyrażenia on (nazwaZdarzenia), zaś procedury obsługi zdarzeń klipowych za pomocą
232                                       Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


wyrażenia onClipEvent (nazwaZdarzenia) — gdzie nazwaZdarzenia jest określeniem
zdarzenia, które ma być obsługiwane.

Z tego względu wszystkie procedury obsługi zdarzeń związanych z przyciskami (oprócz
procedury obsługi zdarzenia keyPress wymagającego dodatkowo parametru w postaci
nazwy klawisza) mają następującą postać:
      on (nazwaZdarzenia) {
         polecenia
      }

Jedna procedura obsługi przypisana do przycisku może odpowiadać na kilka zdarzeń,
które muszą być rozdzielone przecinkami, na przykład:
      on (rollOver, rollOut) {
      // wywołuje wbudowaną funkcję w odpowiedzi na zdarzenie rollOver oraz na
      // zdarzenie rollOut
      playRandomSound( );
      }

Wszystkie procedury obsługi zdarzeń klipowych mają następującą postać:
      onClipEvent (nazwaZdarzenia) {
         polecenia
      }

W przeciwieństwie do procedur obsługi zdarzeń przyciskowych procedury obsługi zdarzeń
przypisywane klipom mogą odpowiadać tylko na jedno zdarzenie.


Tworzenie procedur obsługi zdarzeń
Aby utworzyć procedurę obsługi zdarzenia, musimy napisać skrypt i dołączyć go do
odpowiedniego obiektu. Zaczniemy od procedur najczęściej spotykanych, czyli związa-
nych z przyciskami i klipami filmowymi.

Dodawanie procedur obsługi zdarzeń do przycisków i klipów filmowych

Aby dołączyć procedurę obsługi zdarzenia do przycisku lub klipu filmowego, musimy
fizycznie umieścić jego kod w wybranym przycisku lub klipie filmowym. Możemy zrobić
to tylko w środowisku Flasha, wybierając obiekt na scenie i wprowadzając kod w panelu
Actions (patrz rysunek 10.1).

Spróbujmy napisać prostą procedurę obsługi zdarzenia, która będzie odpowiednia zarówno
dla przycisku, jak i dla klipu.
1. Tworzymy nowy film we Flashu.
2. Tworzymy przycisk i przeciągamy jego klon na główną scenę.
3. Po wybraniu przycisku na scenie wprowadzamy następujący kod w panelu Actions:
Tworzenie procedur obsługi zdarzeń                                                 233




Rysunek 10.1. Przyłączanie procedury obsługi zdarzenia do przycisku

     on (release) {
     trace("Kliknales przycisk");
     }

 4. Wybieramy polecenie Test Movie z menu Control.
 5. Klikamy utworzony wcześniej przycisk. W okienku Output pojawi się napis Kliknales
    przycisk.

Tak długo, jak film jest odtwarzany, a my klikamy przycisk, interpreter rejestruje zda-
rzenie release i uruchamia kod przypisany do procedury obsługi zdarzenia on (release).
Za każdym razem kiedy naciśniemy i puścimy klawisz myszy nad przyciskiem, w okienku
Output ukaże się komunikat „Kliknales przycisk”.

Teraz spróbujemy napisać bardziej interesujący skrypt, który dołączymy do klipu fil-
mowego.
 1. Tworzymy nowy film we Flashu.
 2. Rysujemy prostokąt na głównej scenie.
 3. Wybieramy polecenie Convert to Symbol z menu Insert.
 4. W okienku dialogowym Symbol Properties wpisujemy nazwę nowego symbolu
    rectangle i wybieramy Movie Clip z grupy opcji Behavior.
 5. Klikamy OK, aby zakończyć tworzenie klipu rectangle.
 6. Wybieramy klip rectangle na scenie i wpisujemy następujący kod w panelu Actions:
     onClipEvent (keyDown) {
       _visible=0;
     }
     onClipEvent (keyUp) {
       _visible=1;
     }
234                                               Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


 7. Wybieramy polecenie Test Movie z menu Control.
 8. Klikamy okno z filmem, by mieć pewność, że jest aktywne, a później naciskamy
    i przytrzymujemy dowolny klawisz na klawiaturze. Za każdym razem gdy naciskamy
    i przytrzymujemy klawisz, klip rectangle znika. Za każdym razem gdy puszczamy
    wciśnięty klawisz, klip rectangle pojawia się znowu.

Warto zauważyć, że nie ustawialiśmy ręcznie żadnego wyrażenia wywołującego procedurę
— interpreter sam wywołuje ją, kiedy zachodzi odpowiadające jej zdarzenie.

Flash nie pozwala na dodawanie lub usuwanie procedur obsługi zdarzeń za pomocą
ActionScript podczas odtwarzania filmu. Procedury obsługi zdarzeń muszą zostać przy-
pisane do przycisków lub klipów filmowych wcześniej w środowisku Flasha. Z tego
powodu następujące wyrażenie nie jest poprawne:
      myClip.onKeyDown = function ( ) { _visible = 0; };

W podrozdziale „Dynamiczne uchwyty zdarzeń klipów filmowych” dowiemy się, jak
sobie radzić w podobnych sytuacjach.

Dołączanie procedur obsługi zdarzeń do innych obiektów

Procedury obsługi zdarzeń można przyłączać poza przyciskami i klipami filmowymi rów-
nież do obiektów z dwóch wbudowanych klas XML oraz XMLSocket. Dla tych obiektów
procedury obsługi zdarzeń są podłączane jako metody do klonu (instancji) obiektu.

W obiektach klas XML oraz XMLSocket ActionScript wykorzystuje predefiniowane wła-
ściwości, by przechowywać w nich nazwy procedur obsługi zdarzeń. Na przykład wła-
ściwość onLoad przechowuje nazwę procedury, która ma być wykonana, kiedy zostaną
wczytane zewnętrzne dane XML.

Aby ustawić właściwość onLoad dla obiektu XML, piszemy następujący kod:
      myDoc = new XML( );
      myDoc.onLoad = function ( ) {trace("Wszystkie dane załadowane!"); };

Możemy również zrobić to w inny sposób. Najpierw napiszemy procedurę obsługi zda-
rzenia, a później przypiszemy ją do właściwości onLoad naszego obiektu:
      function doneMsg ( ) {
        trace("Wszystkie dane załadowane!");
      }
      myDoc.onLoad = doneMsg;

Ta składnia jest bardzo podobna do składni JavaScript, gdzie funkcje mogą być przypi-
sywane do właściwości procedury obsługi zdarzenia, co pokazano w listingu 10.1.

Listing 10.1. Przypisywanie procedury obsługi zdarzeń w JavaScript
      // Przypisanie ciała funkcji do procedury obsługi zdarzenia onLoad w JavaScript
      window.onload = function ( ) { alert("Ladowanie zakonczone"); };
      // Inne rozwiązanie, polegające na zdefiniowaniu funkcji, a następnie
      // przypisaniu jej do właściwości onLoad:
Zasięg procedur obsługi zdarzeń                                                               235

    function doneMsg ( ) {
      alert ("Wszystkie dane zaladowane!");
    }
    window.onload = doneMsg;

W przyszłości do większej liczby obiektów ActionScript będzie można przypisywać proce-
dury obsługi zdarzeń za pomocą właściwości obiektu, dlatego warto przyzwyczajać się
już teraz do takiego sposobu podłączania funkcji. Jeżeli nie korzystamy z obiektów XML
i XMLSocket, możemy ćwiczyć ten sposób tworzenia procedur obsługi zdarzeń w JavaScript.
Zaletą tego podejścia jest elastyczność; każda procedura obsługi zdarzenia może być
łatwo przypisana do innego obiektu czy nawet usunięta podczas odtwarzania filmu.

W rozdziale 12., „Obiekty i klasy”, napiszemy więcej o przypisywaniu funkcji do obiek-
tów. Informacje o zdarzeniach obsługiwanych przez obiekty klas XML oraz XMLSocket
znajdują się w części III.


            Długość życia procedur obsługi zdarzeń jest związana z istnieniem obiektów, do
            których są przypisane. Kiedy klip lub przycisk usuniemy ze sceny bądź obiekt XML
            zostanie zlikwidowany, wszystkie procedury obsługi zdarzeń znikają razem z nim.
            Obiekt musi znajdować się na scenie lub na listwie czasu, aby jego procedury obsługi
            zdarzeń były aktywne.



Zasięg procedur obsługi zdarzeń
Podobnie jak każda funkcja, procedury obsługi zdarzeń są wykonywane w predefiniowa-
nym zasięgu. Zasięg określa, skąd interpreter pobiera zmienne, podfunkcje, obiekty i wła-
ściwości, do których odwołuje się ciało funkcji. Rozpatrzymy zasięg procedur obsługi zda-
rzeń w odniesieniu do zdarzeń klipowych, przyciskowych oraz zdarzeń innych obiektów.

Zasięg procedur obsługi zdarzeń klipów filmowych
W przeciwieństwie do normalnych funkcji procedura obsługi zdarzenia klipowego nie
definiuje lokalnego zasięgu. Dla procedur przyłączonych do klipu zasięgiem jest cały
klip, a nie procedura. Oznacza to, że wszystkie zmienne ze skryptów na listwie czasowej
klipu są dostępne dla procedur obsługi zdarzeń. Jeśli na przykład dołączymy do klipu
nazwanego navigation procedurę obsługi zdarzenia enterFrame i wpiszemy w niej
trace(x);, interpreter będzie szukał wartości zmiennej x w skryptach listwy czasowej
klipu navigation.
    onClipEvent (enterFrame) {
      trace(x); // Wyświetla wartość zmiennej navigation.x
    }

Interpreter nie zaczyna od sprawdzenia w zasięgu lokalnym, gdyż takiego nie ma. Jeśli
w naszej procedurze wpiszemy var y = 10;, y zostanie zdefiniowane w listwie cza-
sowej navigation, mimo że słowo kluczowe var użyte w zwykłej funkcji definiuje
zmienną lokalną.
236                                         Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


Najłatwiejszym sposobem zapamiętania zasad rządzących zasięgiem procedury obsługi
zdarzenia w klipie jest traktowanie wyrażeń procedury, tak jakby były dołączone do klatki
w klipie. Załóżmy, że mamy klip o nazwie ball, a w nim zmienną xVelocity. Aby
odwołać się do tej zmiennej z procedury obsługi zdarzenia klipowego (w klipie ball),
wystarczy, że wpiszemy wprost jej nazwę:
      onClipEvent (mouseDown) {
        xVelocity += 10;
      }

Nie musimy wpisywać całej ścieżki tej zmiennej, czyli w tym przypadku _root.ball.
xVelocity, ponieważ interpreter zakłada, że chodzi o zmienną xVelocity z klipu ball.
To samo dotyczy właściwości i metod. Zamiast wpisywać ball._x, wystarczy, jak napi-
szemy _x. Zamiast ball.gotoAndStop(5) wystarczy gotoAndStop(5) na przykład:
      onClipEvent (enterFrame) {
        _x += xVelocity;                      // Przesuń piłkę
        gotoAndPlay(_currentframe - 1)        // Wykonaj małą pętlę
      }

Możemy także zdefiniować funkcję w klipie ball, używając wyrażenia deklaracji we-
wnątrz procedury obsługi zdarzenia w sposób następujący:
      onClipEvent (load) {
        function hideMe ( ) {
                 _visibility = 0;
        }
      }

Można łatwo zapomnieć, że wszystkie wyrażenia w procedurach obsługi zdarzeń klipu
mają zasięg ograniczony do listwy czasowej klipu, a nie do lokalnego zasięgu procedury czy
do listwy czasowej elementu nadrzędnego klipu (czyli listwy, w której klip się znajduje).

Załóżmy, że umieściliśmy nasz klip ball w głównej listwie czasowej filmu oraz że w tej
listwie (a nie w listwie czasowej klipu ball) znajduje się definicja funkcji moveBall( ).
Możemy przez nieuwagę dokonać próby wywołania funkcji moveBall( ) z procedury obsługi
zdarzenia w klipie ball w sposób następujący:
      onClipEvent (enterFrame) {
        moveBall ( ); // Nie zadziała! W klipie ball nie ma funkcji moveBall( ).
                       // Jest ona zdefiniowana na poziomie _root.
      }

Musimy użyć nazwy _root, by odwołać się do funkcji moveBall( ) z głównej listwy czasu:
      onClipEvent (enterFrame) {
        _root.moveBall ( ); // Teraz działa!
      }

Czasami może się zdarzyć, że będziemy chcieli odwołać się z wnętrza procedury obsługi
zdarzenia wprost do bieżącego klipu. Możemy to zrobić, korzystając ze słowa kluczowego
this, które użyte z wnętrza procedury obsługi zdarzenia odnosi się do bieżącego klipu.
Z tego powodu poniższe odwołania z wnętrza procedury obsługi zdarzenia klipowego
są równoznaczne:
Zasięg procedur obsługi zdarzeń                                                   237


    this._x                       // Jest tym samym co następna linia
    _x

    this.gotoAndStop(12);         // Jest tym samym co następna linia
    gotoAndStop(12);

Użycie this jest wymagane, kiedy dynamicznie generujemy nazwę jednej właściwości
bieżącego klipu (a także nazwę zmiennej lub zagnieżdżonego klipu). Poniżej sprawimy,
że zagnieżdżone klipy z serii ball.stripe1, ball.stripe2... będą uruchamiać się
po kolei, w zależności od bieżącej klatki w klipie ball:
    onClipEvent (enterFrame) {
      this["stripe" + _currentframe].play( );
    }

Słowo kluczowe this jest również często wykorzystywane z metodami klipu wymaga-
jącymi podania wprost odwołania do obiektu typu Movie Clip podczas wywołania. Każ-
da metoda klipu filmowego o takiej samej nazwie co globalna funkcja ActionScript musi
być używana z jednoznacznym odwołaniem do klipu. Z tego względu słowo kluczowe
this jest niezbędne, kiedy jako metody wewnątrz procedury obsługi zdarzenia wywo-
łujemy następujące funkcje:
   duplicateMovieClip( ),
   loadMovie( ),
   loadVariables( ),
   print( ),
   printAsBitmap( ),
   removeMovieClip( ),
   startDrag( ),
   unloadMovie( ).

Oto przykład:
    this.duplicateMovieClip("ball2", 1);
    this.loadVariables("vars.txt");
    this.startDrag(true);
    this.unloadMovie( );

O podwójnej naturze tych funkcji powiemy więcej w podrozdziale „Przeciążanie metod
i funkcji globalnych” rozdziału 13., „Klipy filmowe”.

Trzeba zauważyć, że słowo kluczowe this umożliwia odwoływanie się do bieżącego
klipu, nawet jeśli nie ma on określonej nazwy klonu nadanej w środowisku Flash lub po
prostu nie znamy nazwy klipu. Gdy nie znamy nazwy klipu, ale posłużymy się słowem
kluczowym this, możemy wręcz podawać bieżący klip jako odnośnik. Poniżej prezen-
tujemy dość poprawny (i elegancki ) przykład kodu, który to zobrazuje:
238                                           Rozdział 10. Zdarzenia i moduły obsługi zdarzeń

      // KOD NA GŁÓWNEJ LISTWIE CZASOWEJ
      // Ogólna funkcja przesuwająca dowolny klip
      function move (clip, x, y) {
        clip._x += x;
        clip._y += y;
      }

      // KOD W KLIPIE
      // Wywołuje funkcję z głównej listwy czasowej i nakazuje jej przesunąć
      // bie ący klip, odwołując się do niego za pomocą słowa kluczowego this

      onClipEvent (enterFrame) {
        root.move(this, 10, 15);
      }


             W wersji 30 odtwarzacza Flash 5 Player występował błąd powodujący
             nieprawidłowe działanie instrukcji gotoAndStop( ) oraz gotoAndPlay( ),
             jeśli były wywoływane w klipie z etykietami klatek jako parametrami. Na przykład
             taki kod nie będzie działał:
                onClipEvent(load) {
                  gotoAndStop("intro");      // Nie działa we Flash Player 5 r30
                }

             Aby ominąć ten błąd, wystarczy użyć odwołania do samego siebie, na przykład:
                onClipEvent(load) {
                  this.gotoAndStop("intro");
                }



Zakres procedur obsługi zdarzeń dla przycisków
Dla przycisków zakresem procedur obsługi zdarzeń jest listwa czasowa, na której się znaj-
dują. Jeśli na przykład umieścimy przycisk w głównej listwie czasowej, a w procedurze
obsługi zdarzenia dla tego przycisku zadeklarujemy zmienną speed, to zakresem zmiennej
speed będzie główna listwa czasowa (_root):
      // KOD PROCEDURY OBSŁUGI ZDARZEŃ DLA PRZYCISKU
      on (release) {
        var speed = 10;         // Definiuje zmienną speed na poziomie _root
      }

Jeśli w głównej listwie czasu umieścimy klip ball, a wewnątrz niego w procedurze obsługi
zdarzenia zadeklarujemy zmienną speed, to zakres tej zmiennej będzie ograniczony do
klipu ball:
      // KOD PROCEDURY OBSŁUGI ZDARZENIA DLA KLIPU ball
      onClipEvent (load) {
        var speed = 10;      // Definiuje _root.ball.speed, a nie _root.speed
      }

W skrypcie procedury obsługi zdarzeń dla przycisku słowo kluczowe this odnosi się
do listwy czasowej, w której znajduje się przycisk:
Zdarzenia dla przycisków                                                             239


    on (release) {
      // Klip, w którym znajduje się przycisk staje się w 50% przezroczysty
      this._alpha = 50;
      // Przesuwa klip, w którym znajduje się przycisk, o 10 pikseli w prawo
      this._x += 10;
    }


Zakres procedur obsługi zdarzeń innych obiektów
W przeciwieństwie do procedur obsługi zdarzeń klipów filmowych i przycisków proce-
dury obsługi zdarzeń dołączone do obiektów wbudowanych klas, takich jak XML i XML-
Socket, mają zakres dokładnie taki jak funkcje. Procedury obsługi zdarzeń obiektów XML
oraz XMLSocket mają zakres określany podczas definiowania funkcji. Co więcej, procedury
obsługi zdarzeń obiektów XML oraz XMLSocket mają zakres lokalny. Wszystkie zasady
dotyczące zakresu funkcji i opisane w podrozdziale „Zakres funkcji” rozdziału 9.,
„Funkcje”, odnoszą się także do procedur obsługi zdarzeń obiektów, które nie są przyci-
skami ani klipami filmowymi.


Zdarzenia dla przycisków
Tabela 10.1 wprowadza w problematykę różnych zdarzeń dostępnych dla przycisków.
Korzystając ze zdarzeń dla przycisków, możemy łatwo napisać kod dla nawigacji, for-
mularzy, gier, a także innych elementów interfejsu. Przyjrzymy się po kolei wszystkim
zdarzeniom dla przycisków i nauczymy się, w jaki sposób przycisk powinien być opro-
gramowany, by reagować na zdarzenia generowane przez mysz i klawiaturę.

Każde ze zdarzeń przedstawionych w tabeli 10.1 jest obsługiwane przez odpowiadającą
mu procedurę obsługi zdarzenia w postaci on (nazwaZdarzenia). Na przykład zdarzenie
press jest obsługiwane przez procedurę zaczynającą się od on (press). Wyjątkiem jest
procedura obsługi zdarzenia mająca postać on (keypress klawisz), gdzie klawisz jest nazwą
klawisza do sprawdzania. Zdarzenia dla przycisków są wysyłane tylko do przycisku,
nad którym znajduje się mysz. Jeśli kilka przycisków zachodzi na siebie, znajdujący się
najwyżej otrzyma informację o wszystkich zdarzeniach; pozostałe przyciski nie będą
mogły odpowiedzieć na zdarzenia, nawet jeśli przycisk znajdujący się najwyżej nie ma
zdefiniowanych procedur obsługi zdarzeń. W poniższych opisach pojęcie obszar aktywny
odnosi się do obszaru przycisku, który musi znajdować się pod kursorem myszy, aby
zdarzenie zostało wygenerowane (obszar aktywny jest definiowany graficznie podczas
tworzenia przycisku w środowisku Flash).


press
Technicznie rzecz biorąc, kliknięcie myszą jest dwustopniowym procesem: najpierw kla-
wisz myszy jest wciskany — press, a następnie zwalniany — release. Zdarzenie press ma
miejsce, gdy wskaźnik myszy znajduje się nad obszarem aktywnym przycisku, a główny
(lewy dla PC) klawisz myszy jest wciśnięty. Pozostałe klawisze myszy są ignorowane.
240                                             Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


Tabela 10.1. Zdarzenia dla przycisków

 Nazwa zdarzenia       Zdarzenie zachodzi gdy...
 Press                 Główny klawisz myszy (dla PC lewy) został wciśnięty, kiedy wskaźnik
                       myszy znajdował się nad obszarem aktywnym przycisku. Pozostałe klawisze
                       myszy są pomijane
 Release               Główny klawisz myszy (dla PC lewy) został naciśnięty, a następnie
                       zwolniony, kiedy wskaźnik myszy znajdował się nad obszarem aktywnym
                       przycisku
 ReleaseOutside        Główny klawisz myszy (dla PC lewy) został wciśnięty, kiedy wskaźnik
                       myszy znajdował się nad obszarem aktywnym przycisku, a następnie
                       zwolniony, kiedy kursor znajdował się poza tym obszarem
 RollOver              Wskaźnik myszy znalazł się nad obszarem aktywnym, przy niewciśniętym
                       głównym klawiszu myszy
 RollOut               Wskaźnik myszy opuścił obszar aktywny przycisku, żaden klawisz myszy
                       nie został wciśnięty
 DragOut               Główny klawisz myszy (dla PC lewy) został wciśnięty, kiedy wskaźnik
                       myszy znajdował się nad obszarem aktywnym przycisku, następnie przy
                       wciąż wciśniętym klawiszu wskaźnik został usunięty poza obszar aktywny
 DragOver              Główny klawisz myszy (dla PC lewy) został wciśnięty, kiedy wskaźnik
                       myszy znajdował się nad obszarem aktywnym przycisku, następnie przy
                       wciąż wciśniętym klawiszu wskaźnik został usunięty poza obszar aktywny,
                       by na koniec wrócić nad obszar aktywny
 KeyPress              Wybrany (jako parametr) klawisz został naciśnięty. Zazwyczaj zamiast tego
                       zdarzenia stosuje się zdarzenie klipu keyDown

Przyciskowe zdarzenie press można wykorzystać do przycisków opcji czy strzelania
w grach. Jednak aby dać użytkownikowi możliwość zmiany zdania przed zwolnieniem
klawisza myszy, lepiej stosować zdarzenie release.


release
Zdarzenie release ma miejsce, kiedy zostanie wykryta następująca sekwencja działań
użytkownika.
 1. Wskaźnik myszy znajduje się nad obszarem aktywnym przycisku.
 2. Główny klawisz myszy został wciśnięty, kiedy wskaźnik myszy wciąż znajdował się
    nad obszarem aktywnym przycisku (w tym momencie następuje zdarzenie press).
 3. Główny klawisz myszy został zwolniony, podczas gdy wskaźnik wciąż znajdował się
    nad obszarem aktywnym przycisku (w tym momencie następuje zdarzenie release).

Używając zdarzenia release zamiast press, dajemy użytkownikowi szansę na przesunięcie
wskaźnika poza obszar aktywny przycisku nawet po kliknięciu (a dokładnie po wciśnięciu
i przytrzymaniu klawisza myszy), a co za tym idzie, na cofnięcie decyzji.
Zdarzenia dla przycisków                                                           241


releaseOutside
Zdarzenie releaseOutside zazwyczaj wskazuje, że użytkownik zmienił zdanie. Po kliknię-
ciu nad przyciskiem zjechał wskaźnikiem myszy z obszaru aktywnego i dopiero poza
nim puścił klawisz myszy. Aby to zdarzenie miało miejsce, musi zaistnieć następująca
sekwencja działań użytkownika.
1. Wskaźnik myszy znajduje się nad obszarem aktywnym przycisku.
2. Główny klawisz myszy zostaje wciśnięty, kiedy wskaźnik myszy wciąż znajduje się
   nad obszarem aktywnym przycisku (w tym momencie następuje zdarzenie press).
3. Wskaźnik myszy zostaje przesunięty poza obszar aktywny przycisku (w tym momencie
   następuje zdarzenie dragOut).
4. Główny przycisk myszy zostaje zwolniony poza obszarem aktywnym przycisku
   (w tym momencie następuje zdarzenie releaseOutside).

Ze zdarzenia releaseOutside będziemy rzadko korzystać, gdyż oznacza ono, że użytkownik
zrezygnował z akcji.


rollOver
Zdarzenie rollOver zachodzi, kiedy wskaźnik myszy nasuwa się na obszar aktywny przy-
cisku, ale klawisz myszy pozostaje niewciśnięty. Zdarzenie rollOver jest rzadko używane
w ActionScript, ponieważ graficzną podmianę stanów przycisku przygotowuje się w śro-
dowisku Flasha bez pisania skryptów. W tym celu możemy skorzystać z ustawionych
domyślnie klatek w przycisku (up,. over i down), wprowadzając w nich różne stany gra-
ficzne przycisku.

Zdarzenie rollOver we Flash 5 dostarcza poręcznego narzędzia do wydobywania zazna-
czonego tekstu z pola tekstowego. Więcej szczegółów na ten temat znajdziesz w „Wybie-
ranie obiektów” w części III.


rollOut
Zdarzenie rollOut jest uzupełnieniem rollOver i ma miejsce, kiedy wskaźnik myszy prze-
suwa się poza obszar aktywny przycisku, przy czym klawisz myszy nie jest wciśnięty.
Podobnie jak w przypadku rollOver, rollOut jest rzadko wykorzystywane, ponieważ różne
stany graficzne przycisku są ustawiane w środowisku Flasha i nie trzeba podmieniać ich
za pomocą skryptów.


dragOut
Zdarzenie dragOut jest podobne do rollOut, tyle że jest generowane, kiedy klawisz myszy
został wciśnięty podczas opuszczania obszaru aktywnego przycisku przez wskaźnik
myszy. Po zdarzeniu dragOut może nastąpić zarówno zdarzenie releaseOutside (jeśli
242                                         Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


użytkownik puści klawisz myszy), jak i zdarzenie dragOver (jeśli użytkownik przesunie
wskaźnik myszy z powrotem nad obszar aktywny przycisku, nie puszczając klawisza
myszy).


dragOver
Zdarzenie dragOver można spotykać równie rzadko jak Yeti. Jest wyczarowywane po
następującej sekwencji działań użytkownika.
1. Wskaźnik myszy przesuwa się nad obszar aktywny przycisku (następuje zdarzenie
   rollOver).
2. Główny przycisk myszy zostaje wciśnięty i przytrzymany (zdarzenie press).
3. Wskaźnik myszy zostaje przesunięty poza obszar aktywny przycisku (zdarzenie
   dragOut).
4. Wskaźnik myszy wraca nad obszar aktywny przycisku (zdarzenie dragOver).

Tak więc zdarzenie dragOver oznacza, że użytkownik przesunął wskaźnik myszy z obszaru
aktywnego, a później z powrotem nad obszar aktywny przy wciśniętym cały czas przy-
cisku myszy. Trzeba zwrócić uwagę, że w przeciwieństwie do rollOver zdarzenie dragOver
ma miejsce, kiedy klawisz myszy jest wciąż wciśnięty podczas powrotu nad obszar
aktywny przycisku.

keyPress
Zdarzenie keyPress, niezwiązane ze zdarzeniami myszy, w przeciwieństwie do nich
jest wywoływane przez naciśnięcie określonego klawisza na klawiaturze. Umieściliśmy je
tutaj, ponieważ jego procedura obsługi ma składnię typu on (nazwaZdarzenia), podobnie
jak inne procedury obsługi zdarzeń przycisków. Wymaga ona podania jako parametru
nazwy klawisza wywołującego zdarzenie:
      on (keyPress klawisz) {
        wyrazenia
      }

gdzie klawisz to nazwa klawisza wywołującego zdarzenie. Nazwą może być zarówno
litera określająca klawisz (na przykład s lub S), jak i słowo kluczowe reprezentujące
klawisz w następującej formie „<słowoKluczowe>”. Z jedną procedurą może być
związany tylko jeden klawisz. Aby przy użyciu zdarzenia keyPress obsługiwać większą
liczbę klawiszy, należy napisać kilka procedur obsługi zdarzeń, na przykład:
      // Wykrywa wciśnięcie klawisza "a"
      on (keyPress "a") {
        trace("Wciśnięto klawisz 'a'");
      }

      // Wykrywa wciśnięcie Enter
      on (keyPress "<Enter>") {
        trace("Wciśnięto klawisz Enter");
      }
Przegląd zdarzeń klipów filmowych                                                 243


    // Wykrywa wciśnięcie strzałki w dół
    on (keyPress "<Down>") {
      trace("Wciśnięto strzałkę w dół");
    }

Niżej przedstawiamy dozwolone wartości słowa kluczowego jako parametru w procedurze
obsługi zdarzenia keyPress (warto zauważyć, że nie ma pośród nich klawiszy funkcyj-
nych F1, – , F12 — czyli nie są one wykrywane przez zdarzenie keyPress; ich wciśnięcie
wykrywa natomiast obiekt Key):
   <Backspace>,
   <Delete>,
   <Down>,
   <End>,
   <Enter>,
   <Home>,
   <Insert>,
   <Left>,
   <PgDn>,
   <PgUp>,
   <Right>,
   <Space>,
   <Tab>,
   <Up>.

We Flash 4 zdarzenie keyPress było jedynym sposobem obsługi przez użytkownika klawia-
tury. We Flash 5 i następnych wersjach obiekt Key w połączeniu ze zdarzeniami klipów
filmowych keyDown oraz keyUp (opisanymi dalej) daje dużo większą kontrolę nad ob-
sługą klawiatury. Zdarzenie keyPress wykrywa w jednym momencie tylko wciśnięcie
pojedynczego klawisza, podczas gdy obiekt Key potrafi wykryć równoczesne wciśnięcie
kilku klawiszy.


Przegląd zdarzeń klipów filmowych
Zdarzenia klipów są wywoływane przez wiele czynników, poczynając od kliknięć myszą na
pobieraniu danych kończąc. Zdarzenia klipowe możemy podzielić na dwie kategorie: zda-
rzenia wywoływane przez użytkownika oraz zdarzenia związane z odtwarzaniem filmu.

Zdarzenia wywoływane przez użytkownika są związane z klawiaturą i myszą, a zdarzenia
powstające podczas odtwarzania filmu – z wyświetlaniem klatek przez odtwarzacz Flash
Player, z tworzeniem i usuwaniem klipów oraz z wczytywaniem danych.
244                                              Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


Trzeba zauważyć, że zdarzenia klipowe wywoływane przez użytkownika pokrywają się
częściowo z funkcjonalnością zdarzeń przyciskowych opisanych wcześniej. Na przykład
zdarzenie klipowe mouseDown może tak samo wykryć wciśnięcie klawisza myszy jak
zdarzenie przyciskowe press. Jednak zdarzenia klipowe w przeciwieństwie do przyci-
skowych nie są związane z obszarami aktywnymi i położeniem względem nich wskaź-
nika myszy.

Zajmijmy się przez chwilę zdarzeniami klipów filmowych w ActionScript zebranymi
w tabeli 10.2. Najpierw przyjrzymy się zdarzeniom wywoływanym podczas odtwarzania
filmu (enterFrame, load, unload oraz data), a później zdarzeniom użytkownika (mouseDown,
mouseUp, mouseMove, keyDown i keyUp). Każde zdarzenie jest obsługiwane przez odpowiada-
jącą mu procedurę w postaci onClipEvent (nazwaZdarzenia). Na przykład zdarzenie enter-
Frame jest obsługiwane przez procedurę rozpoczynającą się tak: onClipEvent (enterFrame).
Z wyjątkiem zdarzeń load, unload oraz data zdarzenia klipowe są wysyłane do wszystkich
klipów znajdujących się na scenie, nawet jeśli wskaźnik myszy znajduje się nad innym
klipem lub w zupełnie innym miejscu sceny.

Tabela 10.2. Zdarzenia klipów filmowych

 Nazwa zdarzenia       Zdarzenie klipowe ma miejsce gdy...
 EnterFrame            Wskaźnik odtwarzania doszedł do kolejnej klatki (przed wyświetleniem
                       klatki we Flash Player)
 Load                  Klip po raz pierwszy pojawił się na scenie
 Unload                Klip został usunięty ze sceny
 Data                  Zakończono wczytywanie zmiennych do klipu lub część wczytywanego
                       filmu załadowała się do klipu
 MouseDown             Główny klawisz myszy (lewy w PC) został wciśnięty, kiedy klip znajdował
                       się na scenie (pozostałe klawisze są ignorowane)
 MouseUp               Główny klawisz myszy (lewy w PC) został zwolniony, kiedy klawisz
                       znajdował się na scenie
 MouseMove             Wskaźnik myszy został przesunięty (nawet o piksel), kiedy klip znajdował
                       się na scenie. Wskaźnik nie musi znajdować się nad klipem
 KeyDown               Klawisz na klawiaturze został wciśnięty, kiedy klip znajdował się na scenie
 KeyUp                 Wciśnięty klawisz z klawiatury został zwolniony, kiedy klip znajdował się
                       na scenie



Zdarzenia klipowe związane
z odtwarzaniem filmu
Następujące zdarzenia są generowane bez udziału użytkownika w czasie, gdy Flash
odtwarza i ładuje filmy.
Zdarzenia klipowe związane z odtwarzaniem filmu                                               245


enterFrame
Jeśli potrzebujemy pustego, zapętlonego klipu filmowego wywołującego skrypty, proce-
dura obsługi zdarzenia enterFrame jest najlepszym rozwiązaniem. Zdarzenie enterFrame
jest wywoływane dla każdej klatki wyświetlanej w filmie. Na przykład jeśli w klipie
umieścimy poniższy kod, będzie on powiększał się (klip oczywiście) o 10 pikseli wzdłuż
i wszerz na każdą klatkę wyświetloną w filmie:
    onClipEvent (enterFrame) {
      _height += 10;
      _width += 10;
    }

(Przypominamy, że właściwości _height oraz _width są wykorzystywane w zasięgu
klipu, do którego procedura obsługi zdarzenia enterFrame jest przypisana, nie ma więc
potrzeby umieszczania nazwy klonu klipu przed _width i _height).


            Zdarzenie enterFrame jest generowane przed wyświetleniem każdej klatki, nawet jeżeli
            wskaźnik odtwarzania klipu zawierającego procedurę obsługi zdarzenia enterFrame
            jest zatrzymana. Z tego powodu zdarzenie enterFrame jest zawsze generowane.


Podczas odtwarzania we Flash Player wszystkie filmy są cały czas uruchomione, nawet
jeśli na ekranie nic się nie dzieje lub wskaźnik odtwarzania jest zatrzymany na jednej
klatce. Pojedyncza procedura obsługi zdarzenia enterFrame klipu będzie więc uruchamiana
raz za razem tak długo, jak ów klip znajduje się na scenie, bez względu na to, czy sam
klip jest uruchomiony, czy zatrzymany. Jeśli wskaźnik odtwarzania zostanie przesunięty
przez wywołanie funkcji gotoAndStop( ), procedura obsługi zdarzenia enterFrame będzie
wciąż wykonywana dla każdej wyświetlonej klatki. Jeśli wszystkie klipy w całym filmie
zostaną zatrzymane przez funkcję stop( ), wszystkie procedury enterFrame klipów (znaj-
dujących się aktualnie na scenie) będą nadal działać. Zazwyczaj zdarzenie enterFrame jest
wykorzystywane do odświeżania stanu klipu w sposób powtarzalny przez określony
czas. Procedura obsługi zdarzenia enterFrame nie musi być stosowana do zawierającego go
klipu — może być z powodzeniem wykorzystywana z jednoklatkowym pustym klipem
do powtarzalnego wykonywania skryptów. Ta technika nazywana pętlą zdarzeń klipowych
(lub bardziej luźno procesem) została szerzej omówiona w podrozdziale „Pętle na listwie
czasowej i pętle przypisane do zdarzeń klipów filmowych” rozdziału 8., „Pętle”.

Trzeba zauważyć, że procedura obsługi zdarzenia enterFrame jest wykonywana przed
każdym innym kodem z listwy czasowej klipu zawierającego tę procedurę.

Niewielkim nakładem sił możemy, wykorzystując zdarzenie enterFrame, uzyskać naprawdę
rozbudowaną kontrolę nad klipem. Przedstawiony dalej listing 10.7 rozwinie wcześniejszy
kod zmieniający rozmiary klipu, tak by klip na przemian zwiększał się i zmniejszał.
246                                                Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


load
Zdarzenie load ma miejsce w momencie utworzenia klipu to znaczy, kiedy pojawia się
on na scenie po raz pierwszy. Pojawienie się klipu na scenie może odbyć się na jeden
z następujących sposobów.
• Wskaźnik odtwarzania dotarł do klatki kluczowej zawierającej wywołanie nowego
  klonu klipu.
• Klip został powielony z innego klipu przez funkcję duplicateMovieClip( ).
• Klip został umieszczony na scenie przy użyciu funkcji attachMovie( ).
• Zewnętrzny plik .swf został załadowany do klipu przy użyciu funkcji loadMovie( ).
• Zawartość klipu została usunięta przez funkcję unloadMovie( ) (wywołano zdarzenie
  load ponieważ do klipu, którego zawartość została usunięta, jest ładowany pusty klip
  zastępczy).

Ciało procedury obsługi zdarzenia load jest wykonywane po wszystkich kodach zawar-
tych w listwie czasu w klatce, w której klip pojawił się po raz pierwszy.

Zazwyczaj procedura obsługi zdarzenia load jest wykorzystywana do inicjalizacji zmiennych
lub wykonania pewnych czynności wstępnych (na przykład ustalenie rozmiarów oraz
miejsca wyświetlania dynamicznie generowanego klipu). Zdarzenie load doskonale nadaje
się również do zatrzymania w elegancki sposób samoczynnego odtwarzania klipu:
      onClipEvent (load) {
        stop( );
      }

Ponadto procedura obsługi zdarzenia load może być również wykorzystywana do wywo-
ływania funkcji istotnych dla prawidłowego funkcjonowania klipu.

Zdarzenie load jest szczególnie interesujące w połączeniu z funkcją duplicateMovieClip( )
tworzącą nowe klipy filmowe. W listingu 10.2 generujemy cały ekran klipów star, korzy-
stając z jednej procedury obsługi zdarzenia load w łańcuchu rekurencyjnym. Procedura
obsługi zdarzenia load jest wykonywana dla każdego powielonego klipu star, a jego
wykonanie powiela klip po raz kolejny. Proces kończy się, kiedy nastąpi powielenie 100
klipów. Plik źródłowy .fla dla listingu 10.2 jest dostępny w internetowej witrynie Code
Depot oraz na serwerze FTP Wydawnictwa Helion.

Listing 10.2. Tworzenie ekranu klipów star przy użyciu zdarzenia load
      onClipEvent (load) {
        // Umieszczenie bie ącego klipu w losowo wybranym miejscu
        _x = Math.floor(Math.random( ) * 550);
        _y = Math.floor(Math.random( ) * 400);

        // Przypisanie standardowej wielkości bie ącemu klipowi, by nie odziedziczył
        // rozmiarów poprzednika
        _xscale = 100;
        _yscale = 100;
Zdarzenia klipowe związane z odtwarzaniem filmu                                            247


        // Losowe ustalenie wielkości bie ącego klipu miedzy 50% a 150%
        randscale = Math.floor(Math.random( ) * 100) – 50;
        _xscale += randScale;
        _yscale += randScale;

        // Powielenie klipu, chyba e to ju setny egzemplarz
        if (_name != "star100") {
                 nextStarNumber = number(_name.substring(4, _name.length)) + 1;
                 this.duplicateMovieClip("star" + nextStarNumber, nextStarNumber);
        }
    }


unload
Zdarzenie unload jest odwrotnością zdarzenia load i zachodzi, kiedy klip filmowy „kończy
życie”, to znaczy bezpośrednio po ostatniej klatce, w której klip znajduje się na scenie
(ale przed pierwszą klatką, w której już go nie ma).

Klipowe zdarzenie unload mogą powodować przyczyny, które wymieniamy poniżej.
• Wskaźnik odtwarzania dotarł do końca klatek zajmowanych przez klip.
• Klip został usunięty przez funkcję removeMovieClip( ) (usuwającą klipy generowane
  przez funkcje attachMovie( ) oraz duplicateMovieClip ( )).
• Wcześniej załadowany zewnętrzny plik .swf został usunięty z klipu przez funkcję
  unloadMovie( ).
• Zewnętrzny plik .swf został załadowany do klipu.

Ostatnia przyczyna może wydawać się nieco dziwna, lecz w rzeczywistości jest natural-
nym wynikiem sposobu, w jaki filmy są ładowane do Flasha. Za każdym razem gdy plik
.swf jest ładowany do klipu, jego poprzednia zawartość zostaje usunięta, powodując
zdarzenie unload. Poniższy przykład obrazuje zachowanie zdarzeń load oraz unload
w połączeniu z funkcją loadMovie( ).
1. W nowym filmie Flasha umieszczamy na scenie pusty klip w klatce 1. głównej listwy
   czasowej filmu. Nazwiemy go emptyClip.
2. W klatce 5. głównej listwy czasowej ładujemy do klipu emptyClip film test.swf
   za pomocą następującego kodu: emptyClip.loadMovie("test.swf").
3. Uruchamiamy film, wybierając polecenie Play movie z menu Control.

Wyniki są następujące.
1. W klatce 1. pojawia się emptyClip, powodując zdarzenie load.
2. Wywołanie funkcji loadMovie( ) w klatce 5. ma dwojakie skutki:
   a) zawartość klipu emptyClip zostaje usunięta, by zrobić miejsce dla pliku test.swf ,
      oraz powoduje zdarzenie unLoad,
   b) załadowanie test.swf powoduje zdarzenie load.
248                                           Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


Zdarzenie unload jest zazwyczaj wykorzystywane do inicjalizacji kodów czyszczących,
porządkujących scenę lub zerujących w jakiś sposób środowisko programu. Innym zasto-
sowaniem tego zdarzenia jest wykonanie określonych działań (na przykład uruchomienie
innego filmu) po zakończeniu klipu.

data
Zdarzenie data ma miejsce, kiedy do klipu filmowego są wczytywane zewnętrzne dane.
Zdarzenie to, w zależności od rodzaju wczytywanych danych, może zostać wywołane
przez dwie całkiem różne przyczyny. Zajmiemy się obydwoma przyczynami osobno.

Korzystanie z procedury obsługi zdarzenia data w połączeniu z loadVariables( )

Jeśli pobieramy serię zmiennych z serwera za pomocą funkcji loadVariables( ), to aby z nich
skorzystać, musimy poczekać, aż załadują się w całości (patrz część III).

Kiedy klip otrzyma całą porcję pobieranych zmiennych, generowane jest zdarzenie data,
informujące, że można już wykonać kod odwołujący się do tych zmiennych.

Załóżmy, że mamy program zawierający księgę gości, w której odwiedzający mogą wpi-
sywać swoje komentarze. Komentarze te przechowujemy na serwerze. Kiedy użytkow-
nik chce przeczytać komentarz, musimy pobrać go z serwera, korzystając z loadVariables( ).
Nim jednak będziemy mogli pokazać komentarz, musimy wyświetlać ekran informujący
o pobieraniu danych. Wyświetlamy go do czasu, aż potrzebne dane zostaną pobrane
z serwera. Procedura obsługi zdarzenia data poinformuje, kiedy dane zostaną wczytane
i od kiedy możemy bezpiecznie wyświetlić komentarz użytkownikowi.

Listing 10.3 jest uproszczonym skrótem kodu księgi gości ukazującym działanie procedury
obsługi zdarzenia data w połączeniu z loadVariables( ). W naszym przykładzie przycisk
ładuje dwie zmienne zakodowane w formacie URL z pliku tekstowego do klipu. Klip
zawiera procedurę obsługi zdarzenia data wykonywaną, kiedy dane zostaną pobrane. Kod
procedury wyświetla wartość zmiennych. Wiemy, że dane mogą być bezpiecznie wy-
świetlone, gdyż procedura obsługi zdarzenia będzie wykonana po zdarzeniu data (czyli
kiedy dane zostaną w całości pobrane).

Listing 10.3. Oczekiwanie na zdarzenie data
      // ZAWARTOŚĆ PLIKU guestbook.txt
      name=judith&message=hello

      // PRZYCISK WEWNĄTRZ KLIPU
      on (release) {
        this.loadVariables("guestbook.txt");
      }

      // PROCEDURA WEWNĄTRZ KLIPU

      onClipEvent (data) {
        trace(name);
        trace(message);
      }
Zdarzenia klipowe związane z odtwarzaniem filmu                                        249


Ze zdarzeń data będziemy jeszcze korzystać podczas budowaniu formularza w rozdziale 17.,
„Interaktywne formularze”.

Użycie procedury obsługi zdarzenia data w połączeniu z loadMovie( )

Drugi sposób użycia zdarzenia data jest związany z ładowaniem zewnętrznego pliku .swf
do klipu za pomocą funkcji loadMovie( ). Podczas ładowania do klipu nadrzędnego plik
domyślnie uruchamia się natychmiast, nawet gdy tylko jego część jest załadowana. Nie
zawsze jest to działanie pożądane, czasami chcemy mieć pewność, że cały plik lub okre-
ślona jego część została załadowana, nim zacznie się odtwarzanie. Pewność tę można
zyskać dzięki procedurze obsługi zdarzenia data oraz kilku linijkom kodu preloadera.

Zdarzenie data ma miejsce za każdym razem gdy klip nadrzędny otrzyma porcję danych
z zewnętrznego pliku .swf. Definicja „porcji” jest bardziej skomplikowana, niż można by
przypuszczać. Aby wywołać zdarzenie data, co najmniej jedna klatka musi zostać zała-
dowana w całości, od momentu, gdy miało miejsce poprzednie zdarzenie data lub od
rozpoczęcia ładowania pliku .swf. (W rzeczywistości w tym czasie może zostać załado-
wana więcej niż jedna klatka, ale jedna klatka to minimum wymagane, by wywołać zda-
rzenie data). Wywoływanie zdarzeń data jest związane z wyświetlaniem klatek przez
Flash Player. Po wyświetleniu każdej klatki interpreter sprawdza, czy załadowano jakąś
część zewnętrznego pliku .swf do klipu zawierającego procedurę zdarzenia data. Jeśli
część zewnętrznego pliku .swf została załadowana i w części tej znajduje się co najmniej
jedna klatka, następuje zdarzenie data. To sprawdzenie ma miejsce raz i tylko raz na
każdą wyświetloną klatkę (nawet jeśli wskaźnik odczytu jest zatrzymany).

Warto zauważyć, że ze względu na to, iż zdarzenie data jest sprawdzane raz na klatkę,
filmy z wyższą szybkością odtwarzania mają płynniejsze preloadery, gdyż częstsze jest
w nich odświeżanie stanu wczytywania pliku .swf.

Dokładna liczba wywołań zdarzenia data podczas operacji loadMovie( ) zależy od budo-
wy wewnętrznej pliku .swf oraz szybkości łącza. Jednoklatkowy plik .swf, nieważne jak
duży, wywoła tylko jedno zdarzenie data. Z drugiej strony, plik .swf zawierający 100 klatek
może wywołać do 100 osobnych zdarzeń data, w zależności od prędkości odtwarzania
filmu, wielkości w bajtach każdej klatki i prędkości połączenia sieciowego. Jeśli klatki są
duże a połączenie wolne — zostanie wywołanych więcej zdarzeń data (jedno na klatkę).
Jeśli klatki są małe, a połączenie szybkie, zostanie wywołanych mniej zdarzeń data (całe
100 klatek można wczytać podczas wyświetlania dwóch klatek przez Flash Player, wywo-
łując tylko jedno zdarzenie data).

Jak w takim razie wykorzystać procedurę obsługi zdarzenia data podczas budowania
preloadera? Kiedy zdarzenie data ma miejsce w wyniku działania funkcji loadMovie( ),
wiemy, że nastąpił postęp we wczytywaniu pliku .swf. Dzięki temu z procedury obsługi
zdarzenia data możemy sprawdzić, czy została wczytana wystarczająca część pliku, by
zezwolić na odtwarzanie. Użyjemy do tego funkcji getBytesLoaded( ) oraz getBytesTotal( )
w sposób ukazany w listingu 10.4 (alternatywny sposób opiera się na wykorzystaniu
właściwości klipu _framesLoaded oraz _totalFrames). Listing ten zawiera również
pewne rozwiązanie wykorzystane podczas ładowania filmu.
250                                                Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


I jeszcze jedno. Wczytywany plik .swf powinien mieć w pierwszej klatce wywołanie funkcji
stop( ), która zapobiegnie samoczynnemu odtwarzaniu przed wczytaniem w całości.
Zmodyfikowana wersja listingu 10.4 dostępna jest w internetowej witrynie Code Depot
oraz na serwerze FTP Wydawnictwa Helion.

Listing 10.4. Preloader wykorzystujący zdarzenie data
      onClipEvent (data) {
        trace("Otrzymano dane");            // Właśnie się zaczyna

          // Włączenie lampki transferu danych
          _root.transferIndicator.gotoAndStop("on");

           // Jeśli wczytywanie filmu zakończyło się – wyłączenie lampki transferu
           // danych i uruchomienie filmu.
           if (getBytesTotal( ) > 0 && getBytesLoaded( ) == getBytesTotal( )) {
                _root.transferIndicator.gotoAndStop("off");
                 play( );
          }

          // Wyświetlenie odświe onej informacji o ładowaniu w polach tekstowych
          // w _root
           _root.bytesLoaded = getBytesLoaded( );
           _root.bytesTotal = getBytesTotal( );
           _root.clipURL = _url.substring(_url.lastIndexOf("/") + 1, _url.length);
      }



Klipowe zdarzenia
generowane przez użytkownika
Pozostałe zdarzenia klipowe są związane z działaniami użytkownika. Kiedy ma miejsce
któreś z klipowych zdarzeń użytkownika, wszystkie klipy znajdujące się na scenie (nie-
istotne, jak głęboko zagnieżdżone w innych klipach) otrzymują o tym informację. W ten
sposób wiele klipów może zareagować na jedno kliknięcie, ruch myszy czy wciśnięcie
klawisza na klawiaturze. Aby wykonać kod w oparciu o umiejscowienie kursora myszy
względem określonego klipu, uchwyt zdarzenia powinien sprawdzać położenie wskaź-
nika myszy wobec klipu. Wbudowana funkcja hitTest( ) pozwala na łatwe sprawdzenie,
czy kliknięcie nastąpiło w określonym rejonie, co zobaczymy w listingu 10.9.

mouseDown
Podobnie jak przyciskowe zdarzenie press, zdarzenie klipowe mouseDown wykrywa wci-
śnięcie klawisza myszy. Zdarzenie mouseDown zachodzi zawsze, kiedy główny klawisz
myszy zostanie wciśnięty niezależnie od tego, w którym miejscu sceny znajduje się
wskaźnik myszy.

W przeciwieństwie do przyciskowego zdarzenia press zdarzenie mouseDown nie jest
związane z żadnym obszarem aktywnym. W połączeniu ze zdarzeniami mouseUp, mouse-
Move, a także z metodą Mouse.hide( ), mouseDown może być wykorzystane do utworzenia
niestandardowego kursora — pokażemy to w listingu 10.8.
Klipowe zdarzenia generowane przez użytkownika                                        251


mouseUp
Zdarzenie mouseUp jest odpowiednikiem mouseDown. To zdarzenie ma miejsce, za każ-
dym razem kiedy główny klawisz myszy zostanie zwolniony nad dowolnym obszarem
sceny. Podobnie jak w przypadku mouseDown, klip musi znajdować się na scenie pod-
czas kliknięcia, by zdarzenie miało dla niego jakieś konsekwencje. Zdarzenia mouseUp,
mouseDown oraz mouseMove mogą być wykorzystane do zbudowania wielopoziomowej
obsługi myszy bez względu na położenie jej wskaźnika (jak ma to miejsce w przypadku
zdarzeń przyciskowych).


mouseMove
Zdarzenie mouseMove pozwala wychwytywać różnice w położeniu wskaźnika myszy.
Kiedy wskaźnik myszy przemieszcza się, wywoływane są raz za razem zdarzenia mouse-
Move, tak szybko jak tylko procesor jest w stanie je generować. Klip zawierający procedurę
obsługi zdarzenia mouseMove musi być obecny na scenie podczas ruchów myszy, by zda-
rzenie mouseMove odniosło skutek

Zdarzenie mouseMove jest wykorzystywane do aktywowania „wyłączonych” aplikacji, obli-
czania trasy ruchu myszy i tworzenia własnych kursorów, co zobaczymy w listingu 10.8.


keyDown
Zdarzenia keyDown i keyUp są tym samym dla klawiatury, co mouseDown i mouseUp dla
myszy. Razem są podstawowym narzędziem do budowania obsługi klawiatury. Zdarzenie
keyDown zachodzi, kiedy jakiś klawisz na klawiaturze zostanie wciśnięty. Jeśli klawisz
zostanie przytrzymany, zdarzenie keyDown będzie się powtarzać z częstotliwością zależną
od systemu operacyjnego i ustawień klawiatury. W przeciwieństwie do zdarzenia przy-
ciskowego keyPress klipowe zdarzenie keyDown ma miejsce po wciśnięciu dowolnego
klawisza — a nie ściśle określonego. Aby wyłapać (lub inaczej przechwycić bądź wykryć)
zdarzenie keyDown, klip z procedurą obsługi zdarzenia musi znajdować się na scenie
w momencie wciśnięcia klawisza. Następujący kod wyłapuje zdarzenie keyDown:
    onClipEvent (keyDown) {
       trace("Jakiś klawisz został wciśnięty");
    }

Trzeba zauważyć, że nasz kod nie precyzuje, który klawisz został wciśnięty. Jeśli chce-
my, by użytkownik nacisnął dowolny klawisz, to taki kod wystarczy. Zazwyczaj jednak
chcemy związać z określonym klawiszem konkretne działania. Na przykład chcemy, by
różne klawisze kierowały statek kosmiczny w różne strony.

Aby dowiedzieć się, który klawisz spowodował zdarzenie keyDown, korzystamy z wbudo-
wanego obiektu Key, opisującego stan klawiatury. Rodzaj poszukiwanej przez nas informacji
zależy od rodzaju interaktywności, który zamierzamy osiągnąć. Gry za przykład wymagają
ciągle odświeżanej informacji o potencjalnie równoczesnych wciśnięciach klawiszy.
252                                                    Rozdział 10. Zdarzenia i moduły obsługi zdarzeń


Z kolei interfejs nawigacyjny może jedynie potrzebować wykrycia pojedynczego wciśnięcia
klawisza (na przykład w prezentacji — pokazie slajdów — wciśnięcia spacji). Obiekt Key
może poinformować, który klawisz został wciśnięty jako ostatni i czy określony klawisz
jest wciąż wciśnięty. Do odczytywania stanu klawiatury korzystamy z czterech metod
obiektu Key:
      Key.getCode( )              //   dziesiętna wartość kodu ostatnio wciśniętego klawisza
      Key.getAscii( )             //   dziesiętna wartość w kodzie ASCII ostatnio wciśniętego
                                  //   klawisza
      Key.isDown(keycode)         //   zwraca true, jeśli klawisz podany jako parametr jest
                                  //   wciśnięty
      Key.isToggled(keycode)      //   ustala, czy Caps Lock lub Num Lock jest włączony

Listing 10.5 pokazuje procedurę obsługi zdarzenia keyDown wyświetlającą wartość kodu
ASCII ostatnio wciśniętego klawisza.

Listing 10.5. Sprawdzanie ostatnio wciśniętego klawisza
      onClipEvent (keyDown) {
         // Pobranie wartości ASCII ostatnio naciśniętego klawisza i przekształcenie
         // jej w odpowiadający jej znak
         lastKeyPressed = String.fromCharCode(Key.getAscii( ));
         trace("Nacisnąłeś klawisz'" + lastKeyPressed + "' .");
      }

Listing 10.6 pokazuje przykładową procedurę obsługi zdarzenia keyDown sprawdzającą,
czy ostatnim naciśniętym klawiszem była strzałka w górę.

Listing 10.6. Sprawdzanie wciśnięcia strzałki w górę
      onClipEvent (keyDown) {
         // Sprawdzenie, czy strzałka w górę była ostatnim naciśniętym klawiszem
         // Strzałka w gore jest reprezentowana przez właściwość Key.UP
         if (Key.getCode( ) == Key.UP) {
               trace("Strzałka w górę jest ostatnim wciśniętym klawiszem.");
         }
      }

Istnieje kilka sposobów sprawdzania stanu klawiatury, wybór najlepiej pasującego do
aplikacji należy do użytkownika. Przykładowo metoda Key.getAscii( ) zwracająca wartość
ASCII znaku związanego z ostatnio naciśniętym klawiszem na klawiaturach różnych
języków może się różnić (w anglojęzycznych klawiaturach rozmieszczenie liter i znaków
jest jednolite).

Z drugiej strony, metoda Key.getCode( ) zwraca wartość kodu klawisza, a nie kodu ASCII
odpowiadającego mu znaku. Ta metoda może być bardziej przydatna w aplikacjach
z więcej niż jedną wersją językową, a także w aplikacjach hybrydowych działających na
różnych platformach. Możemy się nią posłużyć, jeśli chcemy na przykład użyć czterech
sąsiadujących klawiszy do nawigacji niezależnie od tego, jakim znakom odpowiadają. Wię-
cej informacji na ten temat znajduje się w części III, w rozdziale pod tytułem „Obiekt Key”.

Z internetowej witryny Code Depot oraz serwera FTP Wydawnictwa Helion można po-
brać przykładowe pliki źródłowe .fla z obsługą zdarzeń keyDown i keyUp.
Klipowe zdarzenia generowane przez użytkownika                                               253


            Procedury obsługi zdarzeń reagujące na klawiaturę działają tylko wtedy, gdy okienko
            Flash Player jest okienkiem aktywnym. Użytkownik musi kliknąć okno z filmem,
            by procedury obsługujące zdarzenia klawiatury prawidłowo działały. Musimy wziąć
            pod uwagę zmuszenie użytkownika do kliknięcia jakiegoś przycisku w prezentacji
            przed wejściem do sekcji korzystającej z klawiatury.


Obsługa klawiszy specjalnych

Aby wyłączyć obsługę poleceń menu w odtwarzaczach — projektorach (plikach .exe wyge-
nerowanych z filmu Flash), dodajemy na początku filmu następującą linię kodu.
       fscommand("trapallkeys", "true");

Ta linijka kodu zabezpiecza również przed wyjściem z trybu pełnoekranowego (Fullscreen)
w projektorze przy użyciu klawisza Escape. Aby przechwytywać wciśnięcia klawisza Esc
w projektorze, użyjemy następującego kodu:
    onClipEvent (keyDown) {
       if (Key.getCode( ) == Key.ESCAPE) {
            // Odpowiedz na wciśnięcie klawisza Escape
      }
    }

Warto pamiętać, że klawisz Escape może nie być przechwytywany we wszystkich przeglą-
darkach. Co więcej, nie ma możliwości wyłączenia klawisza Alt lub w przypadku Win-
dows sekwencji Alt/Tab czy Ctrl/Alt/Delete.

Aby przechwytywać wciśnięcie klawisza Tab, utworzymy przycisk z następującym
uchwytem:
    on (keyPress "<Tab>") {
       // Odpowiedz na wciśnięcie klawisza Tab
    }

W filmie odtwarzanym w samodzielnym projektorze klawisz Tab może być przechwy-
tywany również przez procedurę obsługi zdarzenia w klipie, na przykład:
    onClipEvent (keyDown) {
       if (key.getCode( ) == Key.TAB) {
           // Odpowiedz na wciśnięcie klawisza Tab
       }
    }

W niektórych przeglądarkach wciśnięcie klawisza Tab może być wykryte wyłącznie przez
przyciskowe zdarzenie keyPress. Czasami może nawet być konieczne połączenie keyPress
z klipowym zdarzeniem keyUp. Poniższy kod najpierw przechwytuje wciśnięcie Tab za
pomocą keyPress, a następnie reaguje na nie w procedurze obsługi zdarzenia keyUp. Warto
zauważyć, że nie korzystamy ze zdarzenia keyDown. Metoda Key.getCode( ) w przeglą-
darce Internet Explorer działa wyłącznie podczas puszczania klawisza Tab.
    // KOD DLA PRZYCISKU W GŁÓWNEJ LISTWIE CZASOWEJ
    on (keyPress "<Tab>") {
      // Ustawienie nieistotnej zmiennej
      foo = 0;
    }
254                                         Rozdział 10. Zdarzenia i moduły obsługi zdarzeń

      // KOD DLA KLIPU W GŁÓWNEJ LISTWIE CZASOWEJ
      onClipEvent (keyUp) {
        if (Key.getCode( ) == Key.TAB) {
               // ustawienie kursora w polu tekstowym myTextField w _level0
                 Selection.setFocus("_level0.myTextField");
        }
      }

Zazwyczaj celem przechwytywania wciśnięcia klawisza Tab jest przesunięcie kursora
wprowadzania tekstu do określonego pola tekstowego w formularzu. Więcej szczegółów
na ten temat znajdziemy w rozdziale „Metoda Selection.SetFocus( )” w części III.

Aby przechwytywać skróty klawiszowe w rodzaju Ctrl/F, posłużymy się procedurą obsługi
zdarzenia klipowego enterFrame w połączeniu z metodą Key.isDown( ):
      onClipEvent (enterFrame) {
         if (Key.isDown(Key.CONTROL) && Key.isDown(70)) {
            // Odpowiedz na wciśnięcie Ctrl-F
        }
      }

Aby przechwycić wciśnięcie klawisza Enter (Return), można skorzystać z procedury obsługi
zdarzenia przyciskowego:
      on (keyPress "<Enter>") {
        // Odpowiedz na wciśnięcie Enter (na przykład wysłanie formularza)
      }

Można także użyć procedury obsługi zdarzenia keyDown:
      onClipEvent (keyDown) {
        if (Key.getCode( ) == Key.ENTER) {
             // Odpowiedz na wciśnięcie Enter (na przykład wysłanie formularza)
        }
      }

Więcej informacji o przechwytywaniu specjalnych klawiszy (jak klawisze funkcyjne czy
klawisze z klawiatury numerycznej) znajdziemy w rozdziałach „Obiekt Key” oraz „Metoda
Key.getCode( )” w części III.


keyUp
Zdarzenie keyUp ma miejsce, kiedy wciśnięty klawisz zostanie puszczony. Zdarzenie keyUp
ma kluczowe znaczenie przy programowaniu gier — pozwala wyłączyć to, co zostało
wcześniej włączone przy użyciu keyDown; klasycznym przykładem jest hamowanie statku
kosmicznego. Następnym przykładem może być środowisko Flasha, gdzie wciśnięcie
i przytrzymanie spacji czasowo przełącza na narzędzie Hand, zaś puszczenie spacji przywra-
ca poprzednie narzędzie. Takie podejście może znaleźć zastosowanie w aplikacjach do
wywoływania i ukrywania pewnych elementów (na przykład menu).

Podobnie jak w przypadku keyDown, aby otrzymać od zdarzenia keyUp użyteczną infor-
mację, należy je stosować w połączeniu z obiektem Key:
Kolejność wykonywania                                                                    255

    onClipEvent (keyUp) {
       if (!Key.isDown(Key.LEFT)) {
             trace("Strzałka w lewo nie jest wciśnięta");
      }
    }

Ponieważ metoda Key.isDown( ) pozwala sprawdzać stan dowolnego klawisza w dowolnej
chwili, możemy użyć pętli zdarzenia enterFrame by sprawdzać, czy określony klawisz
został puszczony. Niemniej jednak skanowanie klawiatury (czyli ciągłe sprawdzanie
stanu klawiatury) jest mniej efektywne niż czekanie na zdarzenie keyDown, które poin-
formuje nas, że klawisz został wciśnięty.

Podejście ostatecznie wybrane zależy od rodzaju aplikacji, którą tworzymy. W dyna-
micznej aplikacji, takiej jak gra, skanowanie może być jak najbardziej uzasadnione, ponie-
waż i tak każda klatka przechodzi przez główną pętlę gry. Tak więc podczas wykony-
wania normalnej pętli możemy dodatkowo sprawdzać obiekt Key. Na przykład tak:
    // KOD W PUSTYM KLIPIE
    // Pętla powodująca, ze gra działa
    onClipEvent (enterFrame) {
       _root.mainLoop( );
    }

    // GŁÓWNY KOD GRY W GŁÓWNEJ LISTWIE CZASOWEJ
    // To jest wykonywane raz na ka dą wyświetloną klatkę
    function mainLoop ( ) {
      if (Key.isDown(Key.LEFT)) {
           trace("Strzałka w lewo jest wciśnięta");
             // Obracanie statku kosmicznego w lewo
      }
      // Sprawdzanie pozostałych klawiszy, a później rozpoczęcie cyklu od nowa
    }

W statycznej aplikacji z interfejsem nie musimy używać pętli enterFrame do sprawdzania
stanu klawiszy, chyba że chcemy wychwytywać specjalne kombinacje klawiszy (czyli
kilka klawiszy wciśniętych równocześnie). Zwykle powinniśmy stosować procedury obsługi
zdarzeń keyDown oraz keyUp, które są wywoływane dokładnie raz dla każdego naciśnięcia
i puszczenia klawisza. Używając uchwytów zdarzeń keyUp i keyDown, nie musimy zasta-
nawiać się w każdej chwili, czy klawisz jest wciąż wciśnięty. Ta metoda pozwala precyzyjnie
wykrywać wciskanie klawiszy, nawet jeśli użytkownik puści klawisz między klatkami;
jak również zabezpiecza przed sprawdzaniem dwa razy tego samego klawisza, jeśli był on
wciśnięty tylko raz. Zazwyczaj będziemy korzystać z metod Key.getCode( ) oraz Key.getAscii( )
wraz z procedurami obsługi zdarzeń keyDown i keyUp, by sprawdzić, który klawisz został
wciśnięty jako ostatni.


Kolejność wykonywania
Niektóre aplikacje mają kod podzielony na wiele listew czasowych oraz klipowych pro-
cedur obsługi zdarzeń. Nie jest więc niczym niezwykłym, że w pojedynczej klatce będzie
wykonywany kod podzielony na liczne bloki znajdujące się w procedurach obsługi zda-
rzeń, listwach czasowych klipów oraz głównej listwie czasowej. W takich sytuacjach ko-
lejność, w jakiej różne części kodu są wykonywane, może stać się złożona i mieć poważny
ActionScript. Przewodnik encyklopedyczny
ActionScript. Przewodnik encyklopedyczny
ActionScript. Przewodnik encyklopedyczny
ActionScript. Przewodnik encyklopedyczny
ActionScript. Przewodnik encyklopedyczny
ActionScript. Przewodnik encyklopedyczny
ActionScript. Przewodnik encyklopedyczny

More Related Content

What's hot

Hack Proofing XML. Edycja polska
Hack Proofing XML. Edycja polskaHack Proofing XML. Edycja polska
Hack Proofing XML. Edycja polska
Wydawnictwo Helion
 
JavaScript dla każdego
JavaScript dla każdegoJavaScript dla każdego
JavaScript dla każdego
Wydawnictwo Helion
 
Po prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VIPo prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VI
Wydawnictwo Helion
 
JavaScript dla każdego. Wydanie IV
JavaScript dla każdego. Wydanie IVJavaScript dla każdego. Wydanie IV
JavaScript dla każdego. Wydanie IV
Wydawnictwo Helion
 
Flash MX. Programowanie
Flash MX. ProgramowanieFlash MX. Programowanie
Flash MX. Programowanie
Wydawnictwo Helion
 
Flash CS3 Professional PL. Techniki zaawansowane. Klatka po klatce
Flash CS3 Professional PL. Techniki zaawansowane. Klatka po klatceFlash CS3 Professional PL. Techniki zaawansowane. Klatka po klatce
Flash CS3 Professional PL. Techniki zaawansowane. Klatka po klatce
Wydawnictwo Helion
 
Po prostu QuarkXPress 5
Po prostu QuarkXPress 5Po prostu QuarkXPress 5
Po prostu QuarkXPress 5
Wydawnictwo Helion
 
Hack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polskaHack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polska
Wydawnictwo Helion
 
PHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czasPHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czas
Wydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
Wydawnictwo Helion
 
Java. Usługi WWW. Vademecum profesjonalisty
Java. Usługi WWW. Vademecum profesjonalistyJava. Usługi WWW. Vademecum profesjonalisty
Java. Usługi WWW. Vademecum profesjonalisty
Wydawnictwo Helion
 
STL w praktyce. 50 sposobów efektywnego wykorzystania
STL w praktyce. 50 sposobów efektywnego wykorzystaniaSTL w praktyce. 50 sposobów efektywnego wykorzystania
STL w praktyce. 50 sposobów efektywnego wykorzystania
Wydawnictwo Helion
 
Flash 8. Techniki zaawansowane. Klatka po klatce
Flash 8. Techniki zaawansowane. Klatka po klatceFlash 8. Techniki zaawansowane. Klatka po klatce
Flash 8. Techniki zaawansowane. Klatka po klatce
Wydawnictwo Helion
 
Flash MX. Vademecum profesjonalisty
Flash MX. Vademecum profesjonalistyFlash MX. Vademecum profesjonalisty
Flash MX. Vademecum profesjonalisty
Wydawnictwo Helion
 
C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładu
Wydawnictwo Helion
 
Uczta programistów
Uczta programistówUczta programistów
Uczta programistów
Wydawnictwo Helion
 
Macromedia Flash MX 2004. Sztuka projektowania
Macromedia Flash MX 2004. Sztuka projektowaniaMacromedia Flash MX 2004. Sztuka projektowania
Macromedia Flash MX 2004. Sztuka projektowania
Wydawnictwo Helion
 
Dreamweaver MX
Dreamweaver MXDreamweaver MX
Dreamweaver MX
Wydawnictwo Helion
 
AJAX w mgnieniu oka
AJAX w mgnieniu okaAJAX w mgnieniu oka
AJAX w mgnieniu oka
Wydawnictwo Helion
 
Skrypty powłoki. Od podstaw
Skrypty powłoki. Od podstawSkrypty powłoki. Od podstaw
Skrypty powłoki. Od podstaw
Wydawnictwo Helion
 

What's hot (20)

Hack Proofing XML. Edycja polska
Hack Proofing XML. Edycja polskaHack Proofing XML. Edycja polska
Hack Proofing XML. Edycja polska
 
JavaScript dla każdego
JavaScript dla każdegoJavaScript dla każdego
JavaScript dla każdego
 
Po prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VIPo prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VI
 
JavaScript dla każdego. Wydanie IV
JavaScript dla każdego. Wydanie IVJavaScript dla każdego. Wydanie IV
JavaScript dla każdego. Wydanie IV
 
Flash MX. Programowanie
Flash MX. ProgramowanieFlash MX. Programowanie
Flash MX. Programowanie
 
Flash CS3 Professional PL. Techniki zaawansowane. Klatka po klatce
Flash CS3 Professional PL. Techniki zaawansowane. Klatka po klatceFlash CS3 Professional PL. Techniki zaawansowane. Klatka po klatce
Flash CS3 Professional PL. Techniki zaawansowane. Klatka po klatce
 
Po prostu QuarkXPress 5
Po prostu QuarkXPress 5Po prostu QuarkXPress 5
Po prostu QuarkXPress 5
 
Hack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polskaHack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polska
 
PHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czasPHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czas
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
Java. Usługi WWW. Vademecum profesjonalisty
Java. Usługi WWW. Vademecum profesjonalistyJava. Usługi WWW. Vademecum profesjonalisty
Java. Usługi WWW. Vademecum profesjonalisty
 
STL w praktyce. 50 sposobów efektywnego wykorzystania
STL w praktyce. 50 sposobów efektywnego wykorzystaniaSTL w praktyce. 50 sposobów efektywnego wykorzystania
STL w praktyce. 50 sposobów efektywnego wykorzystania
 
Flash 8. Techniki zaawansowane. Klatka po klatce
Flash 8. Techniki zaawansowane. Klatka po klatceFlash 8. Techniki zaawansowane. Klatka po klatce
Flash 8. Techniki zaawansowane. Klatka po klatce
 
Flash MX. Vademecum profesjonalisty
Flash MX. Vademecum profesjonalistyFlash MX. Vademecum profesjonalisty
Flash MX. Vademecum profesjonalisty
 
C++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładuC++. Potęga języka. Od przykładu do przykładu
C++. Potęga języka. Od przykładu do przykładu
 
Uczta programistów
Uczta programistówUczta programistów
Uczta programistów
 
Macromedia Flash MX 2004. Sztuka projektowania
Macromedia Flash MX 2004. Sztuka projektowaniaMacromedia Flash MX 2004. Sztuka projektowania
Macromedia Flash MX 2004. Sztuka projektowania
 
Dreamweaver MX
Dreamweaver MXDreamweaver MX
Dreamweaver MX
 
AJAX w mgnieniu oka
AJAX w mgnieniu okaAJAX w mgnieniu oka
AJAX w mgnieniu oka
 
Skrypty powłoki. Od podstaw
Skrypty powłoki. Od podstawSkrypty powłoki. Od podstaw
Skrypty powłoki. Od podstaw
 

Similar to ActionScript. Przewodnik encyklopedyczny

ActionScript 2.0. Od podstaw
ActionScript 2.0. Od podstawActionScript 2.0. Od podstaw
ActionScript 2.0. Od podstaw
Wydawnictwo Helion
 
PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie III
Wydawnictwo Helion
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowania
Wydawnictwo Helion
 
PHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowaniePHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowanie
Wydawnictwo Helion
 
Java. Sztuka programowania
Java. Sztuka programowaniaJava. Sztuka programowania
Java. Sztuka programowania
Wydawnictwo Helion
 
JavaScript. Rozmówki
JavaScript. RozmówkiJavaScript. Rozmówki
JavaScript. Rozmówki
Wydawnictwo Helion
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
Wydawnictwo Helion
 
Ajax. Wzorce i najlepsze rozwiązania
Ajax. Wzorce i najlepsze rozwiązaniaAjax. Wzorce i najlepsze rozwiązania
Ajax. Wzorce i najlepsze rozwiązania
Wydawnictwo Helion
 
Programowanie w języku C. Szybki start
Programowanie w języku C. Szybki startProgramowanie w języku C. Szybki start
Programowanie w języku C. Szybki start
Wydawnictwo Helion
 
Spring. Zapiski programisty
Spring. Zapiski programistySpring. Zapiski programisty
Spring. Zapiski programisty
Wydawnictwo Helion
 
100 sposobów na Flash
100 sposobów na Flash100 sposobów na Flash
100 sposobów na Flash
Wydawnictwo Helion
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowane
Wydawnictwo Helion
 
Ajax. Niezbędnik projektanta dynamicznych aplikacji
Ajax. Niezbędnik projektanta dynamicznych aplikacjiAjax. Niezbędnik projektanta dynamicznych aplikacji
Ajax. Niezbędnik projektanta dynamicznych aplikacji
Wydawnictwo Helion
 
Flash i PHP5. Podstawy
Flash i PHP5. PodstawyFlash i PHP5. Podstawy
Flash i PHP5. Podstawy
Wydawnictwo Helion
 
Asembler. Sztuka programowania
Asembler. Sztuka programowaniaAsembler. Sztuka programowania
Asembler. Sztuka programowania
Wydawnictwo Helion
 
Język Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistymJęzyk Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistym
Wydawnictwo Helion
 
Programowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modeleProgramowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modele
Wydawnictwo Helion
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Wydawnictwo Helion
 
Flash 8. Klatka po klatce
Flash 8. Klatka po klatceFlash 8. Klatka po klatce
Flash 8. Klatka po klatce
Wydawnictwo Helion
 

Similar to ActionScript. Przewodnik encyklopedyczny (19)

ActionScript 2.0. Od podstaw
ActionScript 2.0. Od podstawActionScript 2.0. Od podstaw
ActionScript 2.0. Od podstaw
 
PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie III
 
C++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowaniaC++. Styl i technika zaawansowanego programowania
C++. Styl i technika zaawansowanego programowania
 
PHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowaniePHP5. Zaawansowane programowanie
PHP5. Zaawansowane programowanie
 
Java. Sztuka programowania
Java. Sztuka programowaniaJava. Sztuka programowania
Java. Sztuka programowania
 
JavaScript. Rozmówki
JavaScript. RozmówkiJavaScript. Rozmówki
JavaScript. Rozmówki
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
 
Ajax. Wzorce i najlepsze rozwiązania
Ajax. Wzorce i najlepsze rozwiązaniaAjax. Wzorce i najlepsze rozwiązania
Ajax. Wzorce i najlepsze rozwiązania
 
Programowanie w języku C. Szybki start
Programowanie w języku C. Szybki startProgramowanie w języku C. Szybki start
Programowanie w języku C. Szybki start
 
Spring. Zapiski programisty
Spring. Zapiski programistySpring. Zapiski programisty
Spring. Zapiski programisty
 
100 sposobów na Flash
100 sposobów na Flash100 sposobów na Flash
100 sposobów na Flash
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowane
 
Ajax. Niezbędnik projektanta dynamicznych aplikacji
Ajax. Niezbędnik projektanta dynamicznych aplikacjiAjax. Niezbędnik projektanta dynamicznych aplikacji
Ajax. Niezbędnik projektanta dynamicznych aplikacji
 
Flash i PHP5. Podstawy
Flash i PHP5. PodstawyFlash i PHP5. Podstawy
Flash i PHP5. Podstawy
 
Asembler. Sztuka programowania
Asembler. Sztuka programowaniaAsembler. Sztuka programowania
Asembler. Sztuka programowania
 
Język Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistymJęzyk Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistym
 
Programowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modeleProgramowanie. Koncepcje, techniki i modele
Programowanie. Koncepcje, techniki i modele
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
 
Flash 8. Klatka po klatce
Flash 8. Klatka po klatceFlash 8. Klatka po klatce
Flash 8. Klatka po klatce
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
Wydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
Wydawnictwo Helion
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
Wydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Wydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
Wydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Wydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Wydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
Wydawnictwo Helion
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
Wydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
Wydawnictwo Helion
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
Wydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
Wydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
Wydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
Wydawnictwo Helion
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
Wydawnictwo Helion
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
Wydawnictwo Helion
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
Wydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

ActionScript. Przewodnik encyklopedyczny

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI ActionScript. Przewodnik encyklopedyczny KATALOG KSI¥¯EK Autor: Colin Moock KATALOG ONLINE T³umaczenie: Marek Binkowski, Ryszard Glego³a, Bohdan G³êbocki, Rafa³ Joñca, Joanna Pasek, ZAMÓW DRUKOWANY KATALOG Wojciech Pazdur ISBN: 83-7197-903-7 Tytu³ orygina³u: ActionScript The Definitive Guide TWÓJ KOSZYK Format: B5, stron: 760 DODAJ DO KOSZYKA Flash jest ju¿ standardem dla sieciowych multimediów, dostêpnych dla ponad 250 milionów u¿ytkowników na ca³ym wiecie. Ksi¹¿ka „ActionScript. Przewodnik encyklopedyczny” to pe³na dokumentacja jêzyka ActionScript — zorientowanego CENNIK I INFORMACJE obiektowo jêzyka programowania, bêd¹cego podstawowym narzêdziem tworzenia zaawansowanych witryn internetowych dla programistów Flasha. Jest kierowana zarówno ZAMÓW INFORMACJE do projektantów i grafików, którzy dopiero ucz¹ siê programowania, jak i do programistów O NOWO CIACH JavaScript, którzy chc¹ przenie æ swoje umiejêtno ci na jêzyk ActionScript (oba te jêzyki opieraj¹ siê na tym samym standardzie ECMAScript). ZAMÓW CENNIK Colin Moock nieraz ju¿ dowiód³ umiejêtno ci przekazywania swojej szerokiej wiedzy w praktyczny i przystêpny sposób. W pe³ni zas³u¿y³ sobie na uznanie, jakim darz¹ go u¿ytkownicy Flasha. CZYTELNIA W pierwszej czê ci ksi¹¿ki opisano podstawowe zagadnienia programistyczne (zmienne, typy danych, operatory, wyra¿enia, funkcje, zdarzenia, tablice i obiekty), po wiêcaj¹c du¿o FRAGMENTY KSI¥¯EK ONLINE uwagi ich wykorzystaniu, szczególnie w obróbce klipów filmowych. Druga czê æ jest po wiêcona typowym zastosowaniom ActionScriptu, takim jak przetwarzanie formularzy sieciowych. Trzecia czê æ, stanowi¹ca leksykon jêzyka, zawiera opis zmiennych globalnych, w³a ciwo ci, metod, detektorów zdarzeñ i obiektów wraz z przyk³adami ich u¿ycia. Korzystaj¹c z tej ksi¹¿ki szybko opanujesz jêzyk ActionScript. Prócz teorii znajdziesz tu praktyczne wskazówki i przyk³ady prezentuj¹ce tworzenie pól tekstowych, przycisków menu, quizów, witryn opartych o dokumenty XML, gier, w których obowi¹zuj¹ zasady praw fizyki, rodowisk dla wielu u¿ytkowników dzia³aj¹cych w czasie rzeczywistym i wielu innych. Skrupulatne opisy poruszaj¹ wiele nieudokumentowanych lub niezbadanych dotychczas tematów. Wydawnictwo Helion „Najlepsza ksi¹¿ka o jêzyku ActionScript, jak¹ widzia³em. Trudno znale æ gdzie indziej ul. Chopina 6 wiêcej informacji na temat tego jêzyka”. 44-100 Gliwice — Slavik Lozben, g³ówny in¿ynier Flasha w firmie Macromedia tel. (32)230-98-63 e-mail: helion@helion.pl
  • 2. Spis treści Słowo wstępne.................................................................................................. 13 Wstęp ................................................................................................................ 17 Część I Podstawy ActionScript.........................................................23 Rozdział 1. Jeżeli nie jesteś programistą... ..................................................... 25 Kilka podstawowych zwrotów ............................................................................................. 27 Następne pojęcia ActionScript............................................................................................... 36 Budujemy quiz ...................................................................................................................... 44 Naprzód! ............................................................................................................................... 58 Rozdział 2. Zmienne......................................................................................... 59 Tworzenie zmiennych (deklaracja)........................................................................................ 60 Przypisywanie zmiennym wartości ...................................................................................... 62 Zmienianie i używanie wartości zmiennych ......................................................................... 63 Typy wartości........................................................................................................................ 65 Zakres zmiennej .................................................................................................................... 67 Kilka praktycznych przykładów ........................................................................................... 78 Naprzód! ............................................................................................................................... 79 Rozdział 3. Dane i typy danych ...................................................................... 81 Dane kontra informacje ......................................................................................................... 81 Znaczenie zależne od typu danych ....................................................................................... 82
  • 3. 4 Spis treści Tworzenie i kategoryzacja danych ........................................................................................ 83 Konwersja typów danych...................................................................................................... 85 Dane proste i dane złożone ................................................................................................... 94 Naprzód! ............................................................................................................................... 95 Rozdział 4. Proste typy danych....................................................................... 97 Typ liczbowy ......................................................................................................................... 97 Liczby całkowite i liczby zmiennoprzecinkowe .................................................................... 97 Liczbowe wyrażenia proste................................................................................................... 98 Korzystanie z liczb w skryptach ActionScript..................................................................... 102 Typ łańcuchowy .................................................................................................................. 103 Korzystanie z łańcuchów w skryptach ActionScript........................................................... 108 Typ logiczny ........................................................................................................................ 126 Typ niezdefiniowany........................................................................................................... 129 Typ pusty, czyli null............................................................................................................ 130 Naprzód! ............................................................................................................................. 130 Rozdział 5. Operatory.................................................................................... 131 Ogólne cechy operatorów ................................................................................................... 131 Operator przypisania .......................................................................................................... 135 Operatory arytmetyczne ..................................................................................................... 136 Operatory równości i nierówności ...................................................................................... 140 Operatory porównania ........................................................................................................ 145 Operatory działające na łańcuchach .................................................................................... 149 Operatory logiczne .............................................................................................................. 149 Operator grupowania.......................................................................................................... 155 Przecinek jako operator....................................................................................................... 156 Operator void ...................................................................................................................... 156 Inne operatory ..................................................................................................................... 157 Naprzód! ............................................................................................................................. 160 Rozdział 6. Polecenia ..................................................................................... 161 Typy poleceń ....................................................................................................................... 162 Składnia poleceń.................................................................................................................. 162 Polecenia ActionScript......................................................................................................... 164 Polecenia i akcje................................................................................................................... 172 Naprzód! ............................................................................................................................. 172
  • 4. Spis treści 5 Rozdział 7. Konstrukcje warunkowe............................................................. 173 Konstrukcja if ...................................................................................................................... 174 Konstrukcja else .................................................................................................................. 176 Konstrukcja else if ............................................................................................................... 177 Symulacja konstrukcji switch .............................................................................................. 178 Składnia krótkich konstrukcji warunkowych...................................................................... 180 Naprzód! ............................................................................................................................. 180 Rozdział 8. Pętle ............................................................................................ 181 Pętla while ........................................................................................................................... 181 Terminologia pętli ............................................................................................................... 184 Pętla do-while...................................................................................................................... 186 Pętla for ............................................................................................................................... 187 Pętla for-in ........................................................................................................................... 188 Przedwczesne zatrzymanie pętli ......................................................................................... 189 Pętle na listwie czasowej i pętle przypisane do zdarzeń klipów filmowych ...................... 192 Naprzód! ............................................................................................................................. 199 Rozdział 9. Funkcje ........................................................................................ 201 Tworzenie funkcji ................................................................................................................ 202 Uruchamianie funkcji .......................................................................................................... 202 Przekazywanie informacji funkcjom ................................................................................... 203 Opuszczanie funkcji i zwracane przez funkcje wartości ..................................................... 207 Funkcje jako wyrażenia proste ............................................................................................ 209 Dostępność funkcji i jej trwałość ......................................................................................... 210 Zakres funkcji ...................................................................................................................... 211 Jeszcze kilka słów o argumentach funkcji ........................................................................... 215 Funkcje rekurencyjne........................................................................................................... 219 Funkcje standardowe .......................................................................................................... 221 Funkcje jako obiekty............................................................................................................ 222 Wszystkie skrypty w jednym miejscu................................................................................. 223 Stary quiz po nowemu ........................................................................................................ 224 Naprzód! ............................................................................................................................. 227 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń ....................................... 229 Synchroniczne wykonanie kodu ......................................................................................... 229 Asynchroniczne wykonanie kodu oparte na zdarzeniach................................................... 230 Rodzaje zdarzeń .................................................................................................................. 230 Procedury obsługi zdarzeń ................................................................................................. 231
  • 5. 6 Spis treści Składnia procedur obsługi zdarzeń..................................................................................... 231 Tworzenie procedur obsługi zdarzeń ................................................................................. 232 Zasięg procedur obsługi zdarzeń ........................................................................................ 235 Zdarzenia dla przycisków ................................................................................................... 239 Przegląd zdarzeń klipów filmowych................................................................................... 243 Zdarzenia klipowe związane z odtwarzaniem filmu .......................................................... 244 Klipowe zdarzenia generowane przez użytkownika .......................................................... 250 Kolejność wykonywania...................................................................................................... 255 Kopiowanie procedur obsługi zdarzeń klipowych ............................................................. 257 Odświeżanie ekranu przy użyciu updateAferEvent........................................................... 258 Dynamiczne procedury obsługi zdarzeń klipów filmowych .............................................. 259 Zastosowanie procedur obsługi zdarzeń ............................................................................ 260 Naprzód! ............................................................................................................................. 262 Rozdział 11. Tablice ....................................................................................... 263 Czym jest tablica?................................................................................................................ 263 Anatomia tablicy ................................................................................................................. 264 Jak tworzymy tablice? ......................................................................................................... 265 Odwołujemy się do elementów tablicy ............................................................................... 268 Rozmiar tablicy.................................................................................................................... 270 Elementy indeksowane nazwami........................................................................................ 272 Dodajemy elementy do tablicy............................................................................................ 273 Usuwamy elementy z tablicy .............................................................................................. 278 Przetwarzanie zawartości tablic .......................................................................................... 282 Tablice wielowymiarowe .................................................................................................... 287 Quiz z pytaniami do wyboru, ujęcie 3. ............................................................................... 288 Naprzód! ............................................................................................................................. 289 Rozdział 12. Obiekty i klasy ......................................................................... 291 Anatomia obiektu................................................................................................................ 294 Tworzymy instancje obiektów ............................................................................................ 295 Właściwości obiektów ......................................................................................................... 296 Metody ................................................................................................................................ 297 Klasy i programowanie zorientowane obiektowo .............................................................. 301 Standardowe obiekty i klasy języka ActionScript ............................................................... 316 Naprzód! ............................................................................................................................. 318
  • 6. Spis treści 7 Rozdział 13. Klipy filmowe ........................................................................... 319 „Obiektowość” klipów filmowych ...................................................................................... 320 Typy klipów filmowych ...................................................................................................... 321 Tworzymy klipy filmowe.................................................................................................... 324 Kolejność filmów i klonów w stosie.................................................................................... 331 Odwołania do klonów oraz filmów głównych.................................................................... 338 Usuwamy klony klipów i całe filmy ................................................................................... 351 Standardowe właściwości klipów filmowych ..................................................................... 354 Metody klipów filmowych .................................................................................................. 355 Praktyczne zastosowania klipów filmowych ...................................................................... 360 Quiz: ostatnia odsłona......................................................................................................... 364 Naprzód! ............................................................................................................................. 367 Rozdział 14. Struktura leksykalna ................................................................ 369 Białe spacje .......................................................................................................................... 369 Zakończenia instrukcji (średniki) ........................................................................................ 370 Komentarze ......................................................................................................................... 372 Słowa kluczowe................................................................................................................... 373 Identyfikatory...................................................................................................................... 374 Rozróżnianie wielkości liter ................................................................................................ 375 Naprzód! ............................................................................................................................. 376 Rozdział 15. Tematy zaawansowane ............................................................ 377 Kopiowanie, porównywanie i przekazywanie danych ....................................................... 377 Wykorzystywanie operacji na bitach................................................................................... 380 Zagadnienia związane z zakresem funkcji.......................................................................... 390 Typ danych „klip filmowy” ................................................................................................ 392 Naprzód! ............................................................................................................................. 392 Część II ActionScript w praktyce ................................................... 393 Rozdział 16. ActionScript; środowisko pracy............................................... 395 Panel Actions....................................................................................................................... 395 Umieszczanie skryptów w klatkach.................................................................................... 398 Umieszczanie skryptów w przyciskach .............................................................................. 399 Umieszczanie skryptów w klipach filmowych.................................................................... 400 Gdzie jest kod? .................................................................................................................... 401 Efektywność pracy .............................................................................................................. 402
  • 7. 8 Spis treści Korzystanie z zewnętrznych skryptów ............................................................................... 403 Klipy filmowe typu Smart Clip ........................................................................................... 405 Naprzód! ............................................................................................................................. 413 Rozdział 17. Interaktywne formularze.......................................................... 415 Obieg danych w formularzu Flasha .................................................................................... 415 Tworzenie interaktywnego formularza............................................................................... 418 Naprzód! ............................................................................................................................. 424 Rozdział 18. Pola tekstowe ........................................................................... 425 Dynamiczne pola tekstowe ................................................................................................. 425 Wejściowe pola tekstowe .................................................................................................... 427 Opcje pól tekstowych .......................................................................................................... 428 Właściwości pól tekstowych ............................................................................................... 432 Obsługa języka HTML ........................................................................................................ 434 Zaznaczanie fragmentów tekstów w polach tekstowych.................................................... 442 Puste pola tekstowe i pętla for-in........................................................................................ 442 Naprzód! ............................................................................................................................. 443 Rozdział 19. Usuwanie błędów...................................................................... 445 Narzędzia do wyszukiwania błędów.................................................................................. 446 Zasady testowania programów........................................................................................... 451 Naprzód! ............................................................................................................................. 455 Część III Leksykon ........................................................................... 457 Dodatki ............................................................................................. 713 Dodatek A Flash w Internecie ....................................................................... 715 Dodatek B Zakres i kody znaków kodowania Latin 1................................ 719 Dodatek C Zgodność z poprzednimi wersjami ............................................. 731 Dodatek D Różnice między ActionScript a ECMA-262 i JavaScript .......... 737 Skorowidz ....................................................................................................... 741
  • 8. 10 Zdarzenia i moduły obsługi zdarzeń Dowiedzieliśmy się sporo o pisaniu instrukcji wykonywanych przez interpreter Action- Script. Potrafimy już prawidłowo powiedzieć interpreterowi co chcemy zrobić, ale jak przekazać mu, kiedy wykonać te operacje? Kod ActionScript nie wywołuje się tak po prostu sam z siebie — coś zawsze powoduje jego wykonanie. Tym „czymś” może być zarówno synchroniczne odtwarzanie filmu, jak również prede- finiowane asynchroniczne zdarzenia. Synchroniczne wykonanie kodu Podczas odtwarzania filmu wskaźnik odtwarzania przemieszcza się od klatki do klatki. Za każdym razem gdy dociera do nowej klatki, interpreter wykonuje kod dołączony do niej. Po wykonaniu kodu następuje odświeżenie ekranu oraz odtworzenie dźwięku. Później wskaźnik przechodzi do następnej klatki. Na przykład jeśli umieścimy kod w klatce 1., zostanie on wykonany, zanim klatka będzie wyświetlona. Jeśli kolejny blok kodu umieścimy w klatce 5. (będącej klatką kluczową) w tym samym filmie, to najpierw zostaną wyświetlone klatki od 1. do 4., następnie będzie wykonany kod zawarty w klatce 5., po czym zostanie ona wyświetlona. Kolejność wy- konywania kodu w klatkach 1. oraz 5. nazywamy synchroniczną, ponieważ następuje w sposób liniowy, wynikający z kolejności klatek na listwie czasu. Cały kod przypisany do klatek w filmie jest wykonywany synchronicznie. Nawet jeśli niektóre klatki nie są odtwarzane w kolejności z powodu instrukcji gotoAndPlay( ) lub gotoAndStop( ), kod związany z każdą klatką jest wykonywany w przewidywalnym po- rządku związanym z ruchem wskaźnika odtwarzania.
  • 9. 230 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń Asynchroniczne wykonanie kodu oparte na zdarzeniach Niektóre części kodu nie są wykonywane w przewidywalnej kolejności. Ich wykonanie następuje, kiedy interpreter ActionScript wykryje, że miało miejsce jedno z predefinio- wanych zdarzeń. Wiele zdarzeń jest związanych z określonymi działaniami użytkownika (jak kliknięcie myszą czy naciśnięcie klawisza na klawiaturze). Tak jak głowica odtwa- rzająca, docierając do klatki, wywołuje kod z nią związany, tak samo wystąpienie zda- rzeń powoduje wykonanie kodu związanego ze zdarzeniami. Kod oparty na zdarzeniach (czyli taki, który jest wykonywany po wystąpieniu zdarzenia) jest określany jako wyko- nywany asynchronicznie, ponieważ jego uruchomienie nie następuje w określonym mo- mencie filmu, a raczej w momencie, w którym wystąpi określone zdarzenie. Programowanie synchroniczne wymaga na początek ustalenia czasu wykonywania kodu. Natomiast programowanie asynchroniczne pozwala dynamicznie reagować na zachodzące zdarzenia. Asynchroniczne wykonywanie kodu ma kluczowe znaczenie dla ActionScript i dla tworzenia interaktywności. W rozdziale tym znajdziesz wiadomości na temat tworzenia kodu opartego na zdarzeniach oraz zestawienie różnych predefiniowanych zdarzeń, obsługiwanych przez ActionScript. Rodzaje zdarzeń Teoretycznie zdarzenia możemy podzielić na dwa rodzaje: zdarzenia użytkownika wywoływane przez działania użytkownika (kliknięcie myszą lub naciśnięcie klawisza), zdarzenia systemowe będące wynikiem odtwarzania filmu (pojawienie się klipu filmowego na scenie lub załadowanie z zewnętrznego pliku serii zmiennych). W ActionScript nie ma różnic syntaktycznych między zdarzeniami użytkownika a zda- rzeniami systemowymi. Zdarzenia systemowe są mniej ewidentne niż klinięcie myszą przez użytkownika. Chociaż moglibyśmy nie traktować na przykład usunięcia klipu fil- mowego ze sceny jako pełnoprawnego zdarzenia, to jednak możliwość reagowania na zdarzenia systemowe daje poważne narzędzie kontroli odtwarzania filmu. Zdarzenia w ActionScript mogą być również podzielone bardziej praktycznie ze względu na obiekty, do których są przypisane. Wszystkie zdarzenia występują w powiązaniu z określonymi obiektami w środowisku Flasha. Interpreter nie uważa, że „użytkownik kliknął”, lecz „użytkownik kliknął ten przycisk” lub „użytkownik kliknął, kiedy ten klip filmowy znajdował się na scenie”. I podobnie interpreter nie stwierdza: „otrzymano dane”, lecz „ten klip filmowy otrzymał jakieś dane”. Tak więc opisujemy kod odpowiadający na zdarzenia za pomocą obiektów, do których te zdarzenia są przypisane.
  • 10. Składnia procedur obsługi zdarzeń 231 Obiekty ActionScript, które mogą odbierać zdarzenia to: • klipy filmowe, • przyciski, • obiekty klas XML oraz XMLSocket. W tym rozdziale dowiemy się, że ActionScript w rzeczywistości posiada dwie różne imple- mentacje obsługi zdarzeń: jedną dla zdarzeń związanych z klipami filmowymi i przyci- skami oraz drugą skojarzoną ze wszystkimi pozostałymi rodzajami obiektów. Procedury obsługi zdarzeń Nie każde zdarzenie powoduje wykonanie kodu. Zdarzenia często mają miejsce bez jakie- gokolwiek wpływu na odtwarzanie filmu. Przykładowo użytkownik może generować dziesiątki zdarzeń, klikając raz za razem przycisk, ale te kliknięcia będą ignorowane. Dlaczego? Ponieważ zdarzenia same nie mogą tworzyć kodu — to my musimy napisać najpierw kod odpowiadający na zdarzenie. Aby powiadomić interpreter, by wykonał kod w odpowiedzi na zdarzenie, musimy dodać do niego procedurę obsługi zdarzenia (event handler) opisującą akcję, która ma zostać podjęta. Procedura obsługi zdarzenia jest czymś w rodzaju specjalnie nazwanej funkcji, która jest wykonywana automatycznie, kiedy dane zdarzenie ma miejsce. W związku z tym two- rzenie procedur obsługi zdarzeń jest bardzo podobne do tworzenia funkcji, jednak z kil- koma różnicami. • Procedury obsługi zdarzeń mają predefiniowane nazwy, takie jak na przykład keyDown. Nie można nazwać procedury obsługi zdarzenia dowolnie, należy użyć jednej z tych predefiniowanych nazw. Pełna lista nazw procedur obsługi zdarzeń znajduje się w tabeli 10.1 oraz 10.2. • Procedury obsługi zdarzeń nie są deklarowane za pomocą słowa kluczowego function. • Procedury obsługi zdarzeń muszą być przypisane do przycisków, klipów filmowych lub innych obiektów, a nie do klatek. Większość zdarzeń została po raz pierwszy wprowadzona we Flashu 5. Jeżeli eksportujemy film do formatu Flash 4, korzystajmy tylko z procedur obsługi zdarzeń związanych z przyciskami (bo tylko one są obsługiwane przez Flash 4) i testujmy dokładnie nasz film w odtwarzaczu Flash Player 4. Składnia procedur obsługi zdarzeń Nazwy zdarzeń (a co za tym idzie, odpowiadających im procedur) są predefiniowane w ActionScript. Procedury obsługi zdarzeń przyciskowych są definiowane przy użyciu wyrażenia on (nazwaZdarzenia), zaś procedury obsługi zdarzeń klipowych za pomocą
  • 11. 232 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń wyrażenia onClipEvent (nazwaZdarzenia) — gdzie nazwaZdarzenia jest określeniem zdarzenia, które ma być obsługiwane. Z tego względu wszystkie procedury obsługi zdarzeń związanych z przyciskami (oprócz procedury obsługi zdarzenia keyPress wymagającego dodatkowo parametru w postaci nazwy klawisza) mają następującą postać: on (nazwaZdarzenia) { polecenia } Jedna procedura obsługi przypisana do przycisku może odpowiadać na kilka zdarzeń, które muszą być rozdzielone przecinkami, na przykład: on (rollOver, rollOut) { // wywołuje wbudowaną funkcję w odpowiedzi na zdarzenie rollOver oraz na // zdarzenie rollOut playRandomSound( ); } Wszystkie procedury obsługi zdarzeń klipowych mają następującą postać: onClipEvent (nazwaZdarzenia) { polecenia } W przeciwieństwie do procedur obsługi zdarzeń przyciskowych procedury obsługi zdarzeń przypisywane klipom mogą odpowiadać tylko na jedno zdarzenie. Tworzenie procedur obsługi zdarzeń Aby utworzyć procedurę obsługi zdarzenia, musimy napisać skrypt i dołączyć go do odpowiedniego obiektu. Zaczniemy od procedur najczęściej spotykanych, czyli związa- nych z przyciskami i klipami filmowymi. Dodawanie procedur obsługi zdarzeń do przycisków i klipów filmowych Aby dołączyć procedurę obsługi zdarzenia do przycisku lub klipu filmowego, musimy fizycznie umieścić jego kod w wybranym przycisku lub klipie filmowym. Możemy zrobić to tylko w środowisku Flasha, wybierając obiekt na scenie i wprowadzając kod w panelu Actions (patrz rysunek 10.1). Spróbujmy napisać prostą procedurę obsługi zdarzenia, która będzie odpowiednia zarówno dla przycisku, jak i dla klipu. 1. Tworzymy nowy film we Flashu. 2. Tworzymy przycisk i przeciągamy jego klon na główną scenę. 3. Po wybraniu przycisku na scenie wprowadzamy następujący kod w panelu Actions:
  • 12. Tworzenie procedur obsługi zdarzeń 233 Rysunek 10.1. Przyłączanie procedury obsługi zdarzenia do przycisku on (release) { trace("Kliknales przycisk"); } 4. Wybieramy polecenie Test Movie z menu Control. 5. Klikamy utworzony wcześniej przycisk. W okienku Output pojawi się napis Kliknales przycisk. Tak długo, jak film jest odtwarzany, a my klikamy przycisk, interpreter rejestruje zda- rzenie release i uruchamia kod przypisany do procedury obsługi zdarzenia on (release). Za każdym razem kiedy naciśniemy i puścimy klawisz myszy nad przyciskiem, w okienku Output ukaże się komunikat „Kliknales przycisk”. Teraz spróbujemy napisać bardziej interesujący skrypt, który dołączymy do klipu fil- mowego. 1. Tworzymy nowy film we Flashu. 2. Rysujemy prostokąt na głównej scenie. 3. Wybieramy polecenie Convert to Symbol z menu Insert. 4. W okienku dialogowym Symbol Properties wpisujemy nazwę nowego symbolu rectangle i wybieramy Movie Clip z grupy opcji Behavior. 5. Klikamy OK, aby zakończyć tworzenie klipu rectangle. 6. Wybieramy klip rectangle na scenie i wpisujemy następujący kod w panelu Actions: onClipEvent (keyDown) { _visible=0; } onClipEvent (keyUp) { _visible=1; }
  • 13. 234 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń 7. Wybieramy polecenie Test Movie z menu Control. 8. Klikamy okno z filmem, by mieć pewność, że jest aktywne, a później naciskamy i przytrzymujemy dowolny klawisz na klawiaturze. Za każdym razem gdy naciskamy i przytrzymujemy klawisz, klip rectangle znika. Za każdym razem gdy puszczamy wciśnięty klawisz, klip rectangle pojawia się znowu. Warto zauważyć, że nie ustawialiśmy ręcznie żadnego wyrażenia wywołującego procedurę — interpreter sam wywołuje ją, kiedy zachodzi odpowiadające jej zdarzenie. Flash nie pozwala na dodawanie lub usuwanie procedur obsługi zdarzeń za pomocą ActionScript podczas odtwarzania filmu. Procedury obsługi zdarzeń muszą zostać przy- pisane do przycisków lub klipów filmowych wcześniej w środowisku Flasha. Z tego powodu następujące wyrażenie nie jest poprawne: myClip.onKeyDown = function ( ) { _visible = 0; }; W podrozdziale „Dynamiczne uchwyty zdarzeń klipów filmowych” dowiemy się, jak sobie radzić w podobnych sytuacjach. Dołączanie procedur obsługi zdarzeń do innych obiektów Procedury obsługi zdarzeń można przyłączać poza przyciskami i klipami filmowymi rów- nież do obiektów z dwóch wbudowanych klas XML oraz XMLSocket. Dla tych obiektów procedury obsługi zdarzeń są podłączane jako metody do klonu (instancji) obiektu. W obiektach klas XML oraz XMLSocket ActionScript wykorzystuje predefiniowane wła- ściwości, by przechowywać w nich nazwy procedur obsługi zdarzeń. Na przykład wła- ściwość onLoad przechowuje nazwę procedury, która ma być wykonana, kiedy zostaną wczytane zewnętrzne dane XML. Aby ustawić właściwość onLoad dla obiektu XML, piszemy następujący kod: myDoc = new XML( ); myDoc.onLoad = function ( ) {trace("Wszystkie dane załadowane!"); }; Możemy również zrobić to w inny sposób. Najpierw napiszemy procedurę obsługi zda- rzenia, a później przypiszemy ją do właściwości onLoad naszego obiektu: function doneMsg ( ) { trace("Wszystkie dane załadowane!"); } myDoc.onLoad = doneMsg; Ta składnia jest bardzo podobna do składni JavaScript, gdzie funkcje mogą być przypi- sywane do właściwości procedury obsługi zdarzenia, co pokazano w listingu 10.1. Listing 10.1. Przypisywanie procedury obsługi zdarzeń w JavaScript // Przypisanie ciała funkcji do procedury obsługi zdarzenia onLoad w JavaScript window.onload = function ( ) { alert("Ladowanie zakonczone"); }; // Inne rozwiązanie, polegające na zdefiniowaniu funkcji, a następnie // przypisaniu jej do właściwości onLoad:
  • 14. Zasięg procedur obsługi zdarzeń 235 function doneMsg ( ) { alert ("Wszystkie dane zaladowane!"); } window.onload = doneMsg; W przyszłości do większej liczby obiektów ActionScript będzie można przypisywać proce- dury obsługi zdarzeń za pomocą właściwości obiektu, dlatego warto przyzwyczajać się już teraz do takiego sposobu podłączania funkcji. Jeżeli nie korzystamy z obiektów XML i XMLSocket, możemy ćwiczyć ten sposób tworzenia procedur obsługi zdarzeń w JavaScript. Zaletą tego podejścia jest elastyczność; każda procedura obsługi zdarzenia może być łatwo przypisana do innego obiektu czy nawet usunięta podczas odtwarzania filmu. W rozdziale 12., „Obiekty i klasy”, napiszemy więcej o przypisywaniu funkcji do obiek- tów. Informacje o zdarzeniach obsługiwanych przez obiekty klas XML oraz XMLSocket znajdują się w części III. Długość życia procedur obsługi zdarzeń jest związana z istnieniem obiektów, do których są przypisane. Kiedy klip lub przycisk usuniemy ze sceny bądź obiekt XML zostanie zlikwidowany, wszystkie procedury obsługi zdarzeń znikają razem z nim. Obiekt musi znajdować się na scenie lub na listwie czasu, aby jego procedury obsługi zdarzeń były aktywne. Zasięg procedur obsługi zdarzeń Podobnie jak każda funkcja, procedury obsługi zdarzeń są wykonywane w predefiniowa- nym zasięgu. Zasięg określa, skąd interpreter pobiera zmienne, podfunkcje, obiekty i wła- ściwości, do których odwołuje się ciało funkcji. Rozpatrzymy zasięg procedur obsługi zda- rzeń w odniesieniu do zdarzeń klipowych, przyciskowych oraz zdarzeń innych obiektów. Zasięg procedur obsługi zdarzeń klipów filmowych W przeciwieństwie do normalnych funkcji procedura obsługi zdarzenia klipowego nie definiuje lokalnego zasięgu. Dla procedur przyłączonych do klipu zasięgiem jest cały klip, a nie procedura. Oznacza to, że wszystkie zmienne ze skryptów na listwie czasowej klipu są dostępne dla procedur obsługi zdarzeń. Jeśli na przykład dołączymy do klipu nazwanego navigation procedurę obsługi zdarzenia enterFrame i wpiszemy w niej trace(x);, interpreter będzie szukał wartości zmiennej x w skryptach listwy czasowej klipu navigation. onClipEvent (enterFrame) { trace(x); // Wyświetla wartość zmiennej navigation.x } Interpreter nie zaczyna od sprawdzenia w zasięgu lokalnym, gdyż takiego nie ma. Jeśli w naszej procedurze wpiszemy var y = 10;, y zostanie zdefiniowane w listwie cza- sowej navigation, mimo że słowo kluczowe var użyte w zwykłej funkcji definiuje zmienną lokalną.
  • 15. 236 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń Najłatwiejszym sposobem zapamiętania zasad rządzących zasięgiem procedury obsługi zdarzenia w klipie jest traktowanie wyrażeń procedury, tak jakby były dołączone do klatki w klipie. Załóżmy, że mamy klip o nazwie ball, a w nim zmienną xVelocity. Aby odwołać się do tej zmiennej z procedury obsługi zdarzenia klipowego (w klipie ball), wystarczy, że wpiszemy wprost jej nazwę: onClipEvent (mouseDown) { xVelocity += 10; } Nie musimy wpisywać całej ścieżki tej zmiennej, czyli w tym przypadku _root.ball. xVelocity, ponieważ interpreter zakłada, że chodzi o zmienną xVelocity z klipu ball. To samo dotyczy właściwości i metod. Zamiast wpisywać ball._x, wystarczy, jak napi- szemy _x. Zamiast ball.gotoAndStop(5) wystarczy gotoAndStop(5) na przykład: onClipEvent (enterFrame) { _x += xVelocity; // Przesuń piłkę gotoAndPlay(_currentframe - 1) // Wykonaj małą pętlę } Możemy także zdefiniować funkcję w klipie ball, używając wyrażenia deklaracji we- wnątrz procedury obsługi zdarzenia w sposób następujący: onClipEvent (load) { function hideMe ( ) { _visibility = 0; } } Można łatwo zapomnieć, że wszystkie wyrażenia w procedurach obsługi zdarzeń klipu mają zasięg ograniczony do listwy czasowej klipu, a nie do lokalnego zasięgu procedury czy do listwy czasowej elementu nadrzędnego klipu (czyli listwy, w której klip się znajduje). Załóżmy, że umieściliśmy nasz klip ball w głównej listwie czasowej filmu oraz że w tej listwie (a nie w listwie czasowej klipu ball) znajduje się definicja funkcji moveBall( ). Możemy przez nieuwagę dokonać próby wywołania funkcji moveBall( ) z procedury obsługi zdarzenia w klipie ball w sposób następujący: onClipEvent (enterFrame) { moveBall ( ); // Nie zadziała! W klipie ball nie ma funkcji moveBall( ). // Jest ona zdefiniowana na poziomie _root. } Musimy użyć nazwy _root, by odwołać się do funkcji moveBall( ) z głównej listwy czasu: onClipEvent (enterFrame) { _root.moveBall ( ); // Teraz działa! } Czasami może się zdarzyć, że będziemy chcieli odwołać się z wnętrza procedury obsługi zdarzenia wprost do bieżącego klipu. Możemy to zrobić, korzystając ze słowa kluczowego this, które użyte z wnętrza procedury obsługi zdarzenia odnosi się do bieżącego klipu. Z tego powodu poniższe odwołania z wnętrza procedury obsługi zdarzenia klipowego są równoznaczne:
  • 16. Zasięg procedur obsługi zdarzeń 237 this._x // Jest tym samym co następna linia _x this.gotoAndStop(12); // Jest tym samym co następna linia gotoAndStop(12); Użycie this jest wymagane, kiedy dynamicznie generujemy nazwę jednej właściwości bieżącego klipu (a także nazwę zmiennej lub zagnieżdżonego klipu). Poniżej sprawimy, że zagnieżdżone klipy z serii ball.stripe1, ball.stripe2... będą uruchamiać się po kolei, w zależności od bieżącej klatki w klipie ball: onClipEvent (enterFrame) { this["stripe" + _currentframe].play( ); } Słowo kluczowe this jest również często wykorzystywane z metodami klipu wymaga- jącymi podania wprost odwołania do obiektu typu Movie Clip podczas wywołania. Każ- da metoda klipu filmowego o takiej samej nazwie co globalna funkcja ActionScript musi być używana z jednoznacznym odwołaniem do klipu. Z tego względu słowo kluczowe this jest niezbędne, kiedy jako metody wewnątrz procedury obsługi zdarzenia wywo- łujemy następujące funkcje: duplicateMovieClip( ), loadMovie( ), loadVariables( ), print( ), printAsBitmap( ), removeMovieClip( ), startDrag( ), unloadMovie( ). Oto przykład: this.duplicateMovieClip("ball2", 1); this.loadVariables("vars.txt"); this.startDrag(true); this.unloadMovie( ); O podwójnej naturze tych funkcji powiemy więcej w podrozdziale „Przeciążanie metod i funkcji globalnych” rozdziału 13., „Klipy filmowe”. Trzeba zauważyć, że słowo kluczowe this umożliwia odwoływanie się do bieżącego klipu, nawet jeśli nie ma on określonej nazwy klonu nadanej w środowisku Flash lub po prostu nie znamy nazwy klipu. Gdy nie znamy nazwy klipu, ale posłużymy się słowem kluczowym this, możemy wręcz podawać bieżący klip jako odnośnik. Poniżej prezen- tujemy dość poprawny (i elegancki ) przykład kodu, który to zobrazuje:
  • 17. 238 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń // KOD NA GŁÓWNEJ LISTWIE CZASOWEJ // Ogólna funkcja przesuwająca dowolny klip function move (clip, x, y) { clip._x += x; clip._y += y; } // KOD W KLIPIE // Wywołuje funkcję z głównej listwy czasowej i nakazuje jej przesunąć // bie ący klip, odwołując się do niego za pomocą słowa kluczowego this onClipEvent (enterFrame) { root.move(this, 10, 15); } W wersji 30 odtwarzacza Flash 5 Player występował błąd powodujący nieprawidłowe działanie instrukcji gotoAndStop( ) oraz gotoAndPlay( ), jeśli były wywoływane w klipie z etykietami klatek jako parametrami. Na przykład taki kod nie będzie działał: onClipEvent(load) { gotoAndStop("intro"); // Nie działa we Flash Player 5 r30 } Aby ominąć ten błąd, wystarczy użyć odwołania do samego siebie, na przykład: onClipEvent(load) { this.gotoAndStop("intro"); } Zakres procedur obsługi zdarzeń dla przycisków Dla przycisków zakresem procedur obsługi zdarzeń jest listwa czasowa, na której się znaj- dują. Jeśli na przykład umieścimy przycisk w głównej listwie czasowej, a w procedurze obsługi zdarzenia dla tego przycisku zadeklarujemy zmienną speed, to zakresem zmiennej speed będzie główna listwa czasowa (_root): // KOD PROCEDURY OBSŁUGI ZDARZEŃ DLA PRZYCISKU on (release) { var speed = 10; // Definiuje zmienną speed na poziomie _root } Jeśli w głównej listwie czasu umieścimy klip ball, a wewnątrz niego w procedurze obsługi zdarzenia zadeklarujemy zmienną speed, to zakres tej zmiennej będzie ograniczony do klipu ball: // KOD PROCEDURY OBSŁUGI ZDARZENIA DLA KLIPU ball onClipEvent (load) { var speed = 10; // Definiuje _root.ball.speed, a nie _root.speed } W skrypcie procedury obsługi zdarzeń dla przycisku słowo kluczowe this odnosi się do listwy czasowej, w której znajduje się przycisk:
  • 18. Zdarzenia dla przycisków 239 on (release) { // Klip, w którym znajduje się przycisk staje się w 50% przezroczysty this._alpha = 50; // Przesuwa klip, w którym znajduje się przycisk, o 10 pikseli w prawo this._x += 10; } Zakres procedur obsługi zdarzeń innych obiektów W przeciwieństwie do procedur obsługi zdarzeń klipów filmowych i przycisków proce- dury obsługi zdarzeń dołączone do obiektów wbudowanych klas, takich jak XML i XML- Socket, mają zakres dokładnie taki jak funkcje. Procedury obsługi zdarzeń obiektów XML oraz XMLSocket mają zakres określany podczas definiowania funkcji. Co więcej, procedury obsługi zdarzeń obiektów XML oraz XMLSocket mają zakres lokalny. Wszystkie zasady dotyczące zakresu funkcji i opisane w podrozdziale „Zakres funkcji” rozdziału 9., „Funkcje”, odnoszą się także do procedur obsługi zdarzeń obiektów, które nie są przyci- skami ani klipami filmowymi. Zdarzenia dla przycisków Tabela 10.1 wprowadza w problematykę różnych zdarzeń dostępnych dla przycisków. Korzystając ze zdarzeń dla przycisków, możemy łatwo napisać kod dla nawigacji, for- mularzy, gier, a także innych elementów interfejsu. Przyjrzymy się po kolei wszystkim zdarzeniom dla przycisków i nauczymy się, w jaki sposób przycisk powinien być opro- gramowany, by reagować na zdarzenia generowane przez mysz i klawiaturę. Każde ze zdarzeń przedstawionych w tabeli 10.1 jest obsługiwane przez odpowiadającą mu procedurę obsługi zdarzenia w postaci on (nazwaZdarzenia). Na przykład zdarzenie press jest obsługiwane przez procedurę zaczynającą się od on (press). Wyjątkiem jest procedura obsługi zdarzenia mająca postać on (keypress klawisz), gdzie klawisz jest nazwą klawisza do sprawdzania. Zdarzenia dla przycisków są wysyłane tylko do przycisku, nad którym znajduje się mysz. Jeśli kilka przycisków zachodzi na siebie, znajdujący się najwyżej otrzyma informację o wszystkich zdarzeniach; pozostałe przyciski nie będą mogły odpowiedzieć na zdarzenia, nawet jeśli przycisk znajdujący się najwyżej nie ma zdefiniowanych procedur obsługi zdarzeń. W poniższych opisach pojęcie obszar aktywny odnosi się do obszaru przycisku, który musi znajdować się pod kursorem myszy, aby zdarzenie zostało wygenerowane (obszar aktywny jest definiowany graficznie podczas tworzenia przycisku w środowisku Flash). press Technicznie rzecz biorąc, kliknięcie myszą jest dwustopniowym procesem: najpierw kla- wisz myszy jest wciskany — press, a następnie zwalniany — release. Zdarzenie press ma miejsce, gdy wskaźnik myszy znajduje się nad obszarem aktywnym przycisku, a główny (lewy dla PC) klawisz myszy jest wciśnięty. Pozostałe klawisze myszy są ignorowane.
  • 19. 240 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń Tabela 10.1. Zdarzenia dla przycisków Nazwa zdarzenia Zdarzenie zachodzi gdy... Press Główny klawisz myszy (dla PC lewy) został wciśnięty, kiedy wskaźnik myszy znajdował się nad obszarem aktywnym przycisku. Pozostałe klawisze myszy są pomijane Release Główny klawisz myszy (dla PC lewy) został naciśnięty, a następnie zwolniony, kiedy wskaźnik myszy znajdował się nad obszarem aktywnym przycisku ReleaseOutside Główny klawisz myszy (dla PC lewy) został wciśnięty, kiedy wskaźnik myszy znajdował się nad obszarem aktywnym przycisku, a następnie zwolniony, kiedy kursor znajdował się poza tym obszarem RollOver Wskaźnik myszy znalazł się nad obszarem aktywnym, przy niewciśniętym głównym klawiszu myszy RollOut Wskaźnik myszy opuścił obszar aktywny przycisku, żaden klawisz myszy nie został wciśnięty DragOut Główny klawisz myszy (dla PC lewy) został wciśnięty, kiedy wskaźnik myszy znajdował się nad obszarem aktywnym przycisku, następnie przy wciąż wciśniętym klawiszu wskaźnik został usunięty poza obszar aktywny DragOver Główny klawisz myszy (dla PC lewy) został wciśnięty, kiedy wskaźnik myszy znajdował się nad obszarem aktywnym przycisku, następnie przy wciąż wciśniętym klawiszu wskaźnik został usunięty poza obszar aktywny, by na koniec wrócić nad obszar aktywny KeyPress Wybrany (jako parametr) klawisz został naciśnięty. Zazwyczaj zamiast tego zdarzenia stosuje się zdarzenie klipu keyDown Przyciskowe zdarzenie press można wykorzystać do przycisków opcji czy strzelania w grach. Jednak aby dać użytkownikowi możliwość zmiany zdania przed zwolnieniem klawisza myszy, lepiej stosować zdarzenie release. release Zdarzenie release ma miejsce, kiedy zostanie wykryta następująca sekwencja działań użytkownika. 1. Wskaźnik myszy znajduje się nad obszarem aktywnym przycisku. 2. Główny klawisz myszy został wciśnięty, kiedy wskaźnik myszy wciąż znajdował się nad obszarem aktywnym przycisku (w tym momencie następuje zdarzenie press). 3. Główny klawisz myszy został zwolniony, podczas gdy wskaźnik wciąż znajdował się nad obszarem aktywnym przycisku (w tym momencie następuje zdarzenie release). Używając zdarzenia release zamiast press, dajemy użytkownikowi szansę na przesunięcie wskaźnika poza obszar aktywny przycisku nawet po kliknięciu (a dokładnie po wciśnięciu i przytrzymaniu klawisza myszy), a co za tym idzie, na cofnięcie decyzji.
  • 20. Zdarzenia dla przycisków 241 releaseOutside Zdarzenie releaseOutside zazwyczaj wskazuje, że użytkownik zmienił zdanie. Po kliknię- ciu nad przyciskiem zjechał wskaźnikiem myszy z obszaru aktywnego i dopiero poza nim puścił klawisz myszy. Aby to zdarzenie miało miejsce, musi zaistnieć następująca sekwencja działań użytkownika. 1. Wskaźnik myszy znajduje się nad obszarem aktywnym przycisku. 2. Główny klawisz myszy zostaje wciśnięty, kiedy wskaźnik myszy wciąż znajduje się nad obszarem aktywnym przycisku (w tym momencie następuje zdarzenie press). 3. Wskaźnik myszy zostaje przesunięty poza obszar aktywny przycisku (w tym momencie następuje zdarzenie dragOut). 4. Główny przycisk myszy zostaje zwolniony poza obszarem aktywnym przycisku (w tym momencie następuje zdarzenie releaseOutside). Ze zdarzenia releaseOutside będziemy rzadko korzystać, gdyż oznacza ono, że użytkownik zrezygnował z akcji. rollOver Zdarzenie rollOver zachodzi, kiedy wskaźnik myszy nasuwa się na obszar aktywny przy- cisku, ale klawisz myszy pozostaje niewciśnięty. Zdarzenie rollOver jest rzadko używane w ActionScript, ponieważ graficzną podmianę stanów przycisku przygotowuje się w śro- dowisku Flasha bez pisania skryptów. W tym celu możemy skorzystać z ustawionych domyślnie klatek w przycisku (up,. over i down), wprowadzając w nich różne stany gra- ficzne przycisku. Zdarzenie rollOver we Flash 5 dostarcza poręcznego narzędzia do wydobywania zazna- czonego tekstu z pola tekstowego. Więcej szczegółów na ten temat znajdziesz w „Wybie- ranie obiektów” w części III. rollOut Zdarzenie rollOut jest uzupełnieniem rollOver i ma miejsce, kiedy wskaźnik myszy prze- suwa się poza obszar aktywny przycisku, przy czym klawisz myszy nie jest wciśnięty. Podobnie jak w przypadku rollOver, rollOut jest rzadko wykorzystywane, ponieważ różne stany graficzne przycisku są ustawiane w środowisku Flasha i nie trzeba podmieniać ich za pomocą skryptów. dragOut Zdarzenie dragOut jest podobne do rollOut, tyle że jest generowane, kiedy klawisz myszy został wciśnięty podczas opuszczania obszaru aktywnego przycisku przez wskaźnik myszy. Po zdarzeniu dragOut może nastąpić zarówno zdarzenie releaseOutside (jeśli
  • 21. 242 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń użytkownik puści klawisz myszy), jak i zdarzenie dragOver (jeśli użytkownik przesunie wskaźnik myszy z powrotem nad obszar aktywny przycisku, nie puszczając klawisza myszy). dragOver Zdarzenie dragOver można spotykać równie rzadko jak Yeti. Jest wyczarowywane po następującej sekwencji działań użytkownika. 1. Wskaźnik myszy przesuwa się nad obszar aktywny przycisku (następuje zdarzenie rollOver). 2. Główny przycisk myszy zostaje wciśnięty i przytrzymany (zdarzenie press). 3. Wskaźnik myszy zostaje przesunięty poza obszar aktywny przycisku (zdarzenie dragOut). 4. Wskaźnik myszy wraca nad obszar aktywny przycisku (zdarzenie dragOver). Tak więc zdarzenie dragOver oznacza, że użytkownik przesunął wskaźnik myszy z obszaru aktywnego, a później z powrotem nad obszar aktywny przy wciśniętym cały czas przy- cisku myszy. Trzeba zwrócić uwagę, że w przeciwieństwie do rollOver zdarzenie dragOver ma miejsce, kiedy klawisz myszy jest wciąż wciśnięty podczas powrotu nad obszar aktywny przycisku. keyPress Zdarzenie keyPress, niezwiązane ze zdarzeniami myszy, w przeciwieństwie do nich jest wywoływane przez naciśnięcie określonego klawisza na klawiaturze. Umieściliśmy je tutaj, ponieważ jego procedura obsługi ma składnię typu on (nazwaZdarzenia), podobnie jak inne procedury obsługi zdarzeń przycisków. Wymaga ona podania jako parametru nazwy klawisza wywołującego zdarzenie: on (keyPress klawisz) { wyrazenia } gdzie klawisz to nazwa klawisza wywołującego zdarzenie. Nazwą może być zarówno litera określająca klawisz (na przykład s lub S), jak i słowo kluczowe reprezentujące klawisz w następującej formie „<słowoKluczowe>”. Z jedną procedurą może być związany tylko jeden klawisz. Aby przy użyciu zdarzenia keyPress obsługiwać większą liczbę klawiszy, należy napisać kilka procedur obsługi zdarzeń, na przykład: // Wykrywa wciśnięcie klawisza "a" on (keyPress "a") { trace("Wciśnięto klawisz 'a'"); } // Wykrywa wciśnięcie Enter on (keyPress "<Enter>") { trace("Wciśnięto klawisz Enter"); }
  • 22. Przegląd zdarzeń klipów filmowych 243 // Wykrywa wciśnięcie strzałki w dół on (keyPress "<Down>") { trace("Wciśnięto strzałkę w dół"); } Niżej przedstawiamy dozwolone wartości słowa kluczowego jako parametru w procedurze obsługi zdarzenia keyPress (warto zauważyć, że nie ma pośród nich klawiszy funkcyj- nych F1, – , F12 — czyli nie są one wykrywane przez zdarzenie keyPress; ich wciśnięcie wykrywa natomiast obiekt Key): <Backspace>, <Delete>, <Down>, <End>, <Enter>, <Home>, <Insert>, <Left>, <PgDn>, <PgUp>, <Right>, <Space>, <Tab>, <Up>. We Flash 4 zdarzenie keyPress było jedynym sposobem obsługi przez użytkownika klawia- tury. We Flash 5 i następnych wersjach obiekt Key w połączeniu ze zdarzeniami klipów filmowych keyDown oraz keyUp (opisanymi dalej) daje dużo większą kontrolę nad ob- sługą klawiatury. Zdarzenie keyPress wykrywa w jednym momencie tylko wciśnięcie pojedynczego klawisza, podczas gdy obiekt Key potrafi wykryć równoczesne wciśnięcie kilku klawiszy. Przegląd zdarzeń klipów filmowych Zdarzenia klipów są wywoływane przez wiele czynników, poczynając od kliknięć myszą na pobieraniu danych kończąc. Zdarzenia klipowe możemy podzielić na dwie kategorie: zda- rzenia wywoływane przez użytkownika oraz zdarzenia związane z odtwarzaniem filmu. Zdarzenia wywoływane przez użytkownika są związane z klawiaturą i myszą, a zdarzenia powstające podczas odtwarzania filmu – z wyświetlaniem klatek przez odtwarzacz Flash Player, z tworzeniem i usuwaniem klipów oraz z wczytywaniem danych.
  • 23. 244 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń Trzeba zauważyć, że zdarzenia klipowe wywoływane przez użytkownika pokrywają się częściowo z funkcjonalnością zdarzeń przyciskowych opisanych wcześniej. Na przykład zdarzenie klipowe mouseDown może tak samo wykryć wciśnięcie klawisza myszy jak zdarzenie przyciskowe press. Jednak zdarzenia klipowe w przeciwieństwie do przyci- skowych nie są związane z obszarami aktywnymi i położeniem względem nich wskaź- nika myszy. Zajmijmy się przez chwilę zdarzeniami klipów filmowych w ActionScript zebranymi w tabeli 10.2. Najpierw przyjrzymy się zdarzeniom wywoływanym podczas odtwarzania filmu (enterFrame, load, unload oraz data), a później zdarzeniom użytkownika (mouseDown, mouseUp, mouseMove, keyDown i keyUp). Każde zdarzenie jest obsługiwane przez odpowiada- jącą mu procedurę w postaci onClipEvent (nazwaZdarzenia). Na przykład zdarzenie enter- Frame jest obsługiwane przez procedurę rozpoczynającą się tak: onClipEvent (enterFrame). Z wyjątkiem zdarzeń load, unload oraz data zdarzenia klipowe są wysyłane do wszystkich klipów znajdujących się na scenie, nawet jeśli wskaźnik myszy znajduje się nad innym klipem lub w zupełnie innym miejscu sceny. Tabela 10.2. Zdarzenia klipów filmowych Nazwa zdarzenia Zdarzenie klipowe ma miejsce gdy... EnterFrame Wskaźnik odtwarzania doszedł do kolejnej klatki (przed wyświetleniem klatki we Flash Player) Load Klip po raz pierwszy pojawił się na scenie Unload Klip został usunięty ze sceny Data Zakończono wczytywanie zmiennych do klipu lub część wczytywanego filmu załadowała się do klipu MouseDown Główny klawisz myszy (lewy w PC) został wciśnięty, kiedy klip znajdował się na scenie (pozostałe klawisze są ignorowane) MouseUp Główny klawisz myszy (lewy w PC) został zwolniony, kiedy klawisz znajdował się na scenie MouseMove Wskaźnik myszy został przesunięty (nawet o piksel), kiedy klip znajdował się na scenie. Wskaźnik nie musi znajdować się nad klipem KeyDown Klawisz na klawiaturze został wciśnięty, kiedy klip znajdował się na scenie KeyUp Wciśnięty klawisz z klawiatury został zwolniony, kiedy klip znajdował się na scenie Zdarzenia klipowe związane z odtwarzaniem filmu Następujące zdarzenia są generowane bez udziału użytkownika w czasie, gdy Flash odtwarza i ładuje filmy.
  • 24. Zdarzenia klipowe związane z odtwarzaniem filmu 245 enterFrame Jeśli potrzebujemy pustego, zapętlonego klipu filmowego wywołującego skrypty, proce- dura obsługi zdarzenia enterFrame jest najlepszym rozwiązaniem. Zdarzenie enterFrame jest wywoływane dla każdej klatki wyświetlanej w filmie. Na przykład jeśli w klipie umieścimy poniższy kod, będzie on powiększał się (klip oczywiście) o 10 pikseli wzdłuż i wszerz na każdą klatkę wyświetloną w filmie: onClipEvent (enterFrame) { _height += 10; _width += 10; } (Przypominamy, że właściwości _height oraz _width są wykorzystywane w zasięgu klipu, do którego procedura obsługi zdarzenia enterFrame jest przypisana, nie ma więc potrzeby umieszczania nazwy klonu klipu przed _width i _height). Zdarzenie enterFrame jest generowane przed wyświetleniem każdej klatki, nawet jeżeli wskaźnik odtwarzania klipu zawierającego procedurę obsługi zdarzenia enterFrame jest zatrzymana. Z tego powodu zdarzenie enterFrame jest zawsze generowane. Podczas odtwarzania we Flash Player wszystkie filmy są cały czas uruchomione, nawet jeśli na ekranie nic się nie dzieje lub wskaźnik odtwarzania jest zatrzymany na jednej klatce. Pojedyncza procedura obsługi zdarzenia enterFrame klipu będzie więc uruchamiana raz za razem tak długo, jak ów klip znajduje się na scenie, bez względu na to, czy sam klip jest uruchomiony, czy zatrzymany. Jeśli wskaźnik odtwarzania zostanie przesunięty przez wywołanie funkcji gotoAndStop( ), procedura obsługi zdarzenia enterFrame będzie wciąż wykonywana dla każdej wyświetlonej klatki. Jeśli wszystkie klipy w całym filmie zostaną zatrzymane przez funkcję stop( ), wszystkie procedury enterFrame klipów (znaj- dujących się aktualnie na scenie) będą nadal działać. Zazwyczaj zdarzenie enterFrame jest wykorzystywane do odświeżania stanu klipu w sposób powtarzalny przez określony czas. Procedura obsługi zdarzenia enterFrame nie musi być stosowana do zawierającego go klipu — może być z powodzeniem wykorzystywana z jednoklatkowym pustym klipem do powtarzalnego wykonywania skryptów. Ta technika nazywana pętlą zdarzeń klipowych (lub bardziej luźno procesem) została szerzej omówiona w podrozdziale „Pętle na listwie czasowej i pętle przypisane do zdarzeń klipów filmowych” rozdziału 8., „Pętle”. Trzeba zauważyć, że procedura obsługi zdarzenia enterFrame jest wykonywana przed każdym innym kodem z listwy czasowej klipu zawierającego tę procedurę. Niewielkim nakładem sił możemy, wykorzystując zdarzenie enterFrame, uzyskać naprawdę rozbudowaną kontrolę nad klipem. Przedstawiony dalej listing 10.7 rozwinie wcześniejszy kod zmieniający rozmiary klipu, tak by klip na przemian zwiększał się i zmniejszał.
  • 25. 246 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń load Zdarzenie load ma miejsce w momencie utworzenia klipu to znaczy, kiedy pojawia się on na scenie po raz pierwszy. Pojawienie się klipu na scenie może odbyć się na jeden z następujących sposobów. • Wskaźnik odtwarzania dotarł do klatki kluczowej zawierającej wywołanie nowego klonu klipu. • Klip został powielony z innego klipu przez funkcję duplicateMovieClip( ). • Klip został umieszczony na scenie przy użyciu funkcji attachMovie( ). • Zewnętrzny plik .swf został załadowany do klipu przy użyciu funkcji loadMovie( ). • Zawartość klipu została usunięta przez funkcję unloadMovie( ) (wywołano zdarzenie load ponieważ do klipu, którego zawartość została usunięta, jest ładowany pusty klip zastępczy). Ciało procedury obsługi zdarzenia load jest wykonywane po wszystkich kodach zawar- tych w listwie czasu w klatce, w której klip pojawił się po raz pierwszy. Zazwyczaj procedura obsługi zdarzenia load jest wykorzystywana do inicjalizacji zmiennych lub wykonania pewnych czynności wstępnych (na przykład ustalenie rozmiarów oraz miejsca wyświetlania dynamicznie generowanego klipu). Zdarzenie load doskonale nadaje się również do zatrzymania w elegancki sposób samoczynnego odtwarzania klipu: onClipEvent (load) { stop( ); } Ponadto procedura obsługi zdarzenia load może być również wykorzystywana do wywo- ływania funkcji istotnych dla prawidłowego funkcjonowania klipu. Zdarzenie load jest szczególnie interesujące w połączeniu z funkcją duplicateMovieClip( ) tworzącą nowe klipy filmowe. W listingu 10.2 generujemy cały ekran klipów star, korzy- stając z jednej procedury obsługi zdarzenia load w łańcuchu rekurencyjnym. Procedura obsługi zdarzenia load jest wykonywana dla każdego powielonego klipu star, a jego wykonanie powiela klip po raz kolejny. Proces kończy się, kiedy nastąpi powielenie 100 klipów. Plik źródłowy .fla dla listingu 10.2 jest dostępny w internetowej witrynie Code Depot oraz na serwerze FTP Wydawnictwa Helion. Listing 10.2. Tworzenie ekranu klipów star przy użyciu zdarzenia load onClipEvent (load) { // Umieszczenie bie ącego klipu w losowo wybranym miejscu _x = Math.floor(Math.random( ) * 550); _y = Math.floor(Math.random( ) * 400); // Przypisanie standardowej wielkości bie ącemu klipowi, by nie odziedziczył // rozmiarów poprzednika _xscale = 100; _yscale = 100;
  • 26. Zdarzenia klipowe związane z odtwarzaniem filmu 247 // Losowe ustalenie wielkości bie ącego klipu miedzy 50% a 150% randscale = Math.floor(Math.random( ) * 100) – 50; _xscale += randScale; _yscale += randScale; // Powielenie klipu, chyba e to ju setny egzemplarz if (_name != "star100") { nextStarNumber = number(_name.substring(4, _name.length)) + 1; this.duplicateMovieClip("star" + nextStarNumber, nextStarNumber); } } unload Zdarzenie unload jest odwrotnością zdarzenia load i zachodzi, kiedy klip filmowy „kończy życie”, to znaczy bezpośrednio po ostatniej klatce, w której klip znajduje się na scenie (ale przed pierwszą klatką, w której już go nie ma). Klipowe zdarzenie unload mogą powodować przyczyny, które wymieniamy poniżej. • Wskaźnik odtwarzania dotarł do końca klatek zajmowanych przez klip. • Klip został usunięty przez funkcję removeMovieClip( ) (usuwającą klipy generowane przez funkcje attachMovie( ) oraz duplicateMovieClip ( )). • Wcześniej załadowany zewnętrzny plik .swf został usunięty z klipu przez funkcję unloadMovie( ). • Zewnętrzny plik .swf został załadowany do klipu. Ostatnia przyczyna może wydawać się nieco dziwna, lecz w rzeczywistości jest natural- nym wynikiem sposobu, w jaki filmy są ładowane do Flasha. Za każdym razem gdy plik .swf jest ładowany do klipu, jego poprzednia zawartość zostaje usunięta, powodując zdarzenie unload. Poniższy przykład obrazuje zachowanie zdarzeń load oraz unload w połączeniu z funkcją loadMovie( ). 1. W nowym filmie Flasha umieszczamy na scenie pusty klip w klatce 1. głównej listwy czasowej filmu. Nazwiemy go emptyClip. 2. W klatce 5. głównej listwy czasowej ładujemy do klipu emptyClip film test.swf za pomocą następującego kodu: emptyClip.loadMovie("test.swf"). 3. Uruchamiamy film, wybierając polecenie Play movie z menu Control. Wyniki są następujące. 1. W klatce 1. pojawia się emptyClip, powodując zdarzenie load. 2. Wywołanie funkcji loadMovie( ) w klatce 5. ma dwojakie skutki: a) zawartość klipu emptyClip zostaje usunięta, by zrobić miejsce dla pliku test.swf , oraz powoduje zdarzenie unLoad, b) załadowanie test.swf powoduje zdarzenie load.
  • 27. 248 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń Zdarzenie unload jest zazwyczaj wykorzystywane do inicjalizacji kodów czyszczących, porządkujących scenę lub zerujących w jakiś sposób środowisko programu. Innym zasto- sowaniem tego zdarzenia jest wykonanie określonych działań (na przykład uruchomienie innego filmu) po zakończeniu klipu. data Zdarzenie data ma miejsce, kiedy do klipu filmowego są wczytywane zewnętrzne dane. Zdarzenie to, w zależności od rodzaju wczytywanych danych, może zostać wywołane przez dwie całkiem różne przyczyny. Zajmiemy się obydwoma przyczynami osobno. Korzystanie z procedury obsługi zdarzenia data w połączeniu z loadVariables( ) Jeśli pobieramy serię zmiennych z serwera za pomocą funkcji loadVariables( ), to aby z nich skorzystać, musimy poczekać, aż załadują się w całości (patrz część III). Kiedy klip otrzyma całą porcję pobieranych zmiennych, generowane jest zdarzenie data, informujące, że można już wykonać kod odwołujący się do tych zmiennych. Załóżmy, że mamy program zawierający księgę gości, w której odwiedzający mogą wpi- sywać swoje komentarze. Komentarze te przechowujemy na serwerze. Kiedy użytkow- nik chce przeczytać komentarz, musimy pobrać go z serwera, korzystając z loadVariables( ). Nim jednak będziemy mogli pokazać komentarz, musimy wyświetlać ekran informujący o pobieraniu danych. Wyświetlamy go do czasu, aż potrzebne dane zostaną pobrane z serwera. Procedura obsługi zdarzenia data poinformuje, kiedy dane zostaną wczytane i od kiedy możemy bezpiecznie wyświetlić komentarz użytkownikowi. Listing 10.3 jest uproszczonym skrótem kodu księgi gości ukazującym działanie procedury obsługi zdarzenia data w połączeniu z loadVariables( ). W naszym przykładzie przycisk ładuje dwie zmienne zakodowane w formacie URL z pliku tekstowego do klipu. Klip zawiera procedurę obsługi zdarzenia data wykonywaną, kiedy dane zostaną pobrane. Kod procedury wyświetla wartość zmiennych. Wiemy, że dane mogą być bezpiecznie wy- świetlone, gdyż procedura obsługi zdarzenia będzie wykonana po zdarzeniu data (czyli kiedy dane zostaną w całości pobrane). Listing 10.3. Oczekiwanie na zdarzenie data // ZAWARTOŚĆ PLIKU guestbook.txt name=judith&message=hello // PRZYCISK WEWNĄTRZ KLIPU on (release) { this.loadVariables("guestbook.txt"); } // PROCEDURA WEWNĄTRZ KLIPU onClipEvent (data) { trace(name); trace(message); }
  • 28. Zdarzenia klipowe związane z odtwarzaniem filmu 249 Ze zdarzeń data będziemy jeszcze korzystać podczas budowaniu formularza w rozdziale 17., „Interaktywne formularze”. Użycie procedury obsługi zdarzenia data w połączeniu z loadMovie( ) Drugi sposób użycia zdarzenia data jest związany z ładowaniem zewnętrznego pliku .swf do klipu za pomocą funkcji loadMovie( ). Podczas ładowania do klipu nadrzędnego plik domyślnie uruchamia się natychmiast, nawet gdy tylko jego część jest załadowana. Nie zawsze jest to działanie pożądane, czasami chcemy mieć pewność, że cały plik lub okre- ślona jego część została załadowana, nim zacznie się odtwarzanie. Pewność tę można zyskać dzięki procedurze obsługi zdarzenia data oraz kilku linijkom kodu preloadera. Zdarzenie data ma miejsce za każdym razem gdy klip nadrzędny otrzyma porcję danych z zewnętrznego pliku .swf. Definicja „porcji” jest bardziej skomplikowana, niż można by przypuszczać. Aby wywołać zdarzenie data, co najmniej jedna klatka musi zostać zała- dowana w całości, od momentu, gdy miało miejsce poprzednie zdarzenie data lub od rozpoczęcia ładowania pliku .swf. (W rzeczywistości w tym czasie może zostać załado- wana więcej niż jedna klatka, ale jedna klatka to minimum wymagane, by wywołać zda- rzenie data). Wywoływanie zdarzeń data jest związane z wyświetlaniem klatek przez Flash Player. Po wyświetleniu każdej klatki interpreter sprawdza, czy załadowano jakąś część zewnętrznego pliku .swf do klipu zawierającego procedurę zdarzenia data. Jeśli część zewnętrznego pliku .swf została załadowana i w części tej znajduje się co najmniej jedna klatka, następuje zdarzenie data. To sprawdzenie ma miejsce raz i tylko raz na każdą wyświetloną klatkę (nawet jeśli wskaźnik odczytu jest zatrzymany). Warto zauważyć, że ze względu na to, iż zdarzenie data jest sprawdzane raz na klatkę, filmy z wyższą szybkością odtwarzania mają płynniejsze preloadery, gdyż częstsze jest w nich odświeżanie stanu wczytywania pliku .swf. Dokładna liczba wywołań zdarzenia data podczas operacji loadMovie( ) zależy od budo- wy wewnętrznej pliku .swf oraz szybkości łącza. Jednoklatkowy plik .swf, nieważne jak duży, wywoła tylko jedno zdarzenie data. Z drugiej strony, plik .swf zawierający 100 klatek może wywołać do 100 osobnych zdarzeń data, w zależności od prędkości odtwarzania filmu, wielkości w bajtach każdej klatki i prędkości połączenia sieciowego. Jeśli klatki są duże a połączenie wolne — zostanie wywołanych więcej zdarzeń data (jedno na klatkę). Jeśli klatki są małe, a połączenie szybkie, zostanie wywołanych mniej zdarzeń data (całe 100 klatek można wczytać podczas wyświetlania dwóch klatek przez Flash Player, wywo- łując tylko jedno zdarzenie data). Jak w takim razie wykorzystać procedurę obsługi zdarzenia data podczas budowania preloadera? Kiedy zdarzenie data ma miejsce w wyniku działania funkcji loadMovie( ), wiemy, że nastąpił postęp we wczytywaniu pliku .swf. Dzięki temu z procedury obsługi zdarzenia data możemy sprawdzić, czy została wczytana wystarczająca część pliku, by zezwolić na odtwarzanie. Użyjemy do tego funkcji getBytesLoaded( ) oraz getBytesTotal( ) w sposób ukazany w listingu 10.4 (alternatywny sposób opiera się na wykorzystaniu właściwości klipu _framesLoaded oraz _totalFrames). Listing ten zawiera również pewne rozwiązanie wykorzystane podczas ładowania filmu.
  • 29. 250 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń I jeszcze jedno. Wczytywany plik .swf powinien mieć w pierwszej klatce wywołanie funkcji stop( ), która zapobiegnie samoczynnemu odtwarzaniu przed wczytaniem w całości. Zmodyfikowana wersja listingu 10.4 dostępna jest w internetowej witrynie Code Depot oraz na serwerze FTP Wydawnictwa Helion. Listing 10.4. Preloader wykorzystujący zdarzenie data onClipEvent (data) { trace("Otrzymano dane"); // Właśnie się zaczyna // Włączenie lampki transferu danych _root.transferIndicator.gotoAndStop("on"); // Jeśli wczytywanie filmu zakończyło się – wyłączenie lampki transferu // danych i uruchomienie filmu. if (getBytesTotal( ) > 0 && getBytesLoaded( ) == getBytesTotal( )) { _root.transferIndicator.gotoAndStop("off"); play( ); } // Wyświetlenie odświe onej informacji o ładowaniu w polach tekstowych // w _root _root.bytesLoaded = getBytesLoaded( ); _root.bytesTotal = getBytesTotal( ); _root.clipURL = _url.substring(_url.lastIndexOf("/") + 1, _url.length); } Klipowe zdarzenia generowane przez użytkownika Pozostałe zdarzenia klipowe są związane z działaniami użytkownika. Kiedy ma miejsce któreś z klipowych zdarzeń użytkownika, wszystkie klipy znajdujące się na scenie (nie- istotne, jak głęboko zagnieżdżone w innych klipach) otrzymują o tym informację. W ten sposób wiele klipów może zareagować na jedno kliknięcie, ruch myszy czy wciśnięcie klawisza na klawiaturze. Aby wykonać kod w oparciu o umiejscowienie kursora myszy względem określonego klipu, uchwyt zdarzenia powinien sprawdzać położenie wskaź- nika myszy wobec klipu. Wbudowana funkcja hitTest( ) pozwala na łatwe sprawdzenie, czy kliknięcie nastąpiło w określonym rejonie, co zobaczymy w listingu 10.9. mouseDown Podobnie jak przyciskowe zdarzenie press, zdarzenie klipowe mouseDown wykrywa wci- śnięcie klawisza myszy. Zdarzenie mouseDown zachodzi zawsze, kiedy główny klawisz myszy zostanie wciśnięty niezależnie od tego, w którym miejscu sceny znajduje się wskaźnik myszy. W przeciwieństwie do przyciskowego zdarzenia press zdarzenie mouseDown nie jest związane z żadnym obszarem aktywnym. W połączeniu ze zdarzeniami mouseUp, mouse- Move, a także z metodą Mouse.hide( ), mouseDown może być wykorzystane do utworzenia niestandardowego kursora — pokażemy to w listingu 10.8.
  • 30. Klipowe zdarzenia generowane przez użytkownika 251 mouseUp Zdarzenie mouseUp jest odpowiednikiem mouseDown. To zdarzenie ma miejsce, za każ- dym razem kiedy główny klawisz myszy zostanie zwolniony nad dowolnym obszarem sceny. Podobnie jak w przypadku mouseDown, klip musi znajdować się na scenie pod- czas kliknięcia, by zdarzenie miało dla niego jakieś konsekwencje. Zdarzenia mouseUp, mouseDown oraz mouseMove mogą być wykorzystane do zbudowania wielopoziomowej obsługi myszy bez względu na położenie jej wskaźnika (jak ma to miejsce w przypadku zdarzeń przyciskowych). mouseMove Zdarzenie mouseMove pozwala wychwytywać różnice w położeniu wskaźnika myszy. Kiedy wskaźnik myszy przemieszcza się, wywoływane są raz za razem zdarzenia mouse- Move, tak szybko jak tylko procesor jest w stanie je generować. Klip zawierający procedurę obsługi zdarzenia mouseMove musi być obecny na scenie podczas ruchów myszy, by zda- rzenie mouseMove odniosło skutek Zdarzenie mouseMove jest wykorzystywane do aktywowania „wyłączonych” aplikacji, obli- czania trasy ruchu myszy i tworzenia własnych kursorów, co zobaczymy w listingu 10.8. keyDown Zdarzenia keyDown i keyUp są tym samym dla klawiatury, co mouseDown i mouseUp dla myszy. Razem są podstawowym narzędziem do budowania obsługi klawiatury. Zdarzenie keyDown zachodzi, kiedy jakiś klawisz na klawiaturze zostanie wciśnięty. Jeśli klawisz zostanie przytrzymany, zdarzenie keyDown będzie się powtarzać z częstotliwością zależną od systemu operacyjnego i ustawień klawiatury. W przeciwieństwie do zdarzenia przy- ciskowego keyPress klipowe zdarzenie keyDown ma miejsce po wciśnięciu dowolnego klawisza — a nie ściśle określonego. Aby wyłapać (lub inaczej przechwycić bądź wykryć) zdarzenie keyDown, klip z procedurą obsługi zdarzenia musi znajdować się na scenie w momencie wciśnięcia klawisza. Następujący kod wyłapuje zdarzenie keyDown: onClipEvent (keyDown) { trace("Jakiś klawisz został wciśnięty"); } Trzeba zauważyć, że nasz kod nie precyzuje, który klawisz został wciśnięty. Jeśli chce- my, by użytkownik nacisnął dowolny klawisz, to taki kod wystarczy. Zazwyczaj jednak chcemy związać z określonym klawiszem konkretne działania. Na przykład chcemy, by różne klawisze kierowały statek kosmiczny w różne strony. Aby dowiedzieć się, który klawisz spowodował zdarzenie keyDown, korzystamy z wbudo- wanego obiektu Key, opisującego stan klawiatury. Rodzaj poszukiwanej przez nas informacji zależy od rodzaju interaktywności, który zamierzamy osiągnąć. Gry za przykład wymagają ciągle odświeżanej informacji o potencjalnie równoczesnych wciśnięciach klawiszy.
  • 31. 252 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń Z kolei interfejs nawigacyjny może jedynie potrzebować wykrycia pojedynczego wciśnięcia klawisza (na przykład w prezentacji — pokazie slajdów — wciśnięcia spacji). Obiekt Key może poinformować, który klawisz został wciśnięty jako ostatni i czy określony klawisz jest wciąż wciśnięty. Do odczytywania stanu klawiatury korzystamy z czterech metod obiektu Key: Key.getCode( ) // dziesiętna wartość kodu ostatnio wciśniętego klawisza Key.getAscii( ) // dziesiętna wartość w kodzie ASCII ostatnio wciśniętego // klawisza Key.isDown(keycode) // zwraca true, jeśli klawisz podany jako parametr jest // wciśnięty Key.isToggled(keycode) // ustala, czy Caps Lock lub Num Lock jest włączony Listing 10.5 pokazuje procedurę obsługi zdarzenia keyDown wyświetlającą wartość kodu ASCII ostatnio wciśniętego klawisza. Listing 10.5. Sprawdzanie ostatnio wciśniętego klawisza onClipEvent (keyDown) { // Pobranie wartości ASCII ostatnio naciśniętego klawisza i przekształcenie // jej w odpowiadający jej znak lastKeyPressed = String.fromCharCode(Key.getAscii( )); trace("Nacisnąłeś klawisz'" + lastKeyPressed + "' ."); } Listing 10.6 pokazuje przykładową procedurę obsługi zdarzenia keyDown sprawdzającą, czy ostatnim naciśniętym klawiszem była strzałka w górę. Listing 10.6. Sprawdzanie wciśnięcia strzałki w górę onClipEvent (keyDown) { // Sprawdzenie, czy strzałka w górę była ostatnim naciśniętym klawiszem // Strzałka w gore jest reprezentowana przez właściwość Key.UP if (Key.getCode( ) == Key.UP) { trace("Strzałka w górę jest ostatnim wciśniętym klawiszem."); } } Istnieje kilka sposobów sprawdzania stanu klawiatury, wybór najlepiej pasującego do aplikacji należy do użytkownika. Przykładowo metoda Key.getAscii( ) zwracająca wartość ASCII znaku związanego z ostatnio naciśniętym klawiszem na klawiaturach różnych języków może się różnić (w anglojęzycznych klawiaturach rozmieszczenie liter i znaków jest jednolite). Z drugiej strony, metoda Key.getCode( ) zwraca wartość kodu klawisza, a nie kodu ASCII odpowiadającego mu znaku. Ta metoda może być bardziej przydatna w aplikacjach z więcej niż jedną wersją językową, a także w aplikacjach hybrydowych działających na różnych platformach. Możemy się nią posłużyć, jeśli chcemy na przykład użyć czterech sąsiadujących klawiszy do nawigacji niezależnie od tego, jakim znakom odpowiadają. Wię- cej informacji na ten temat znajduje się w części III, w rozdziale pod tytułem „Obiekt Key”. Z internetowej witryny Code Depot oraz serwera FTP Wydawnictwa Helion można po- brać przykładowe pliki źródłowe .fla z obsługą zdarzeń keyDown i keyUp.
  • 32. Klipowe zdarzenia generowane przez użytkownika 253 Procedury obsługi zdarzeń reagujące na klawiaturę działają tylko wtedy, gdy okienko Flash Player jest okienkiem aktywnym. Użytkownik musi kliknąć okno z filmem, by procedury obsługujące zdarzenia klawiatury prawidłowo działały. Musimy wziąć pod uwagę zmuszenie użytkownika do kliknięcia jakiegoś przycisku w prezentacji przed wejściem do sekcji korzystającej z klawiatury. Obsługa klawiszy specjalnych Aby wyłączyć obsługę poleceń menu w odtwarzaczach — projektorach (plikach .exe wyge- nerowanych z filmu Flash), dodajemy na początku filmu następującą linię kodu. fscommand("trapallkeys", "true"); Ta linijka kodu zabezpiecza również przed wyjściem z trybu pełnoekranowego (Fullscreen) w projektorze przy użyciu klawisza Escape. Aby przechwytywać wciśnięcia klawisza Esc w projektorze, użyjemy następującego kodu: onClipEvent (keyDown) { if (Key.getCode( ) == Key.ESCAPE) { // Odpowiedz na wciśnięcie klawisza Escape } } Warto pamiętać, że klawisz Escape może nie być przechwytywany we wszystkich przeglą- darkach. Co więcej, nie ma możliwości wyłączenia klawisza Alt lub w przypadku Win- dows sekwencji Alt/Tab czy Ctrl/Alt/Delete. Aby przechwytywać wciśnięcie klawisza Tab, utworzymy przycisk z następującym uchwytem: on (keyPress "<Tab>") { // Odpowiedz na wciśnięcie klawisza Tab } W filmie odtwarzanym w samodzielnym projektorze klawisz Tab może być przechwy- tywany również przez procedurę obsługi zdarzenia w klipie, na przykład: onClipEvent (keyDown) { if (key.getCode( ) == Key.TAB) { // Odpowiedz na wciśnięcie klawisza Tab } } W niektórych przeglądarkach wciśnięcie klawisza Tab może być wykryte wyłącznie przez przyciskowe zdarzenie keyPress. Czasami może nawet być konieczne połączenie keyPress z klipowym zdarzeniem keyUp. Poniższy kod najpierw przechwytuje wciśnięcie Tab za pomocą keyPress, a następnie reaguje na nie w procedurze obsługi zdarzenia keyUp. Warto zauważyć, że nie korzystamy ze zdarzenia keyDown. Metoda Key.getCode( ) w przeglą- darce Internet Explorer działa wyłącznie podczas puszczania klawisza Tab. // KOD DLA PRZYCISKU W GŁÓWNEJ LISTWIE CZASOWEJ on (keyPress "<Tab>") { // Ustawienie nieistotnej zmiennej foo = 0; }
  • 33. 254 Rozdział 10. Zdarzenia i moduły obsługi zdarzeń // KOD DLA KLIPU W GŁÓWNEJ LISTWIE CZASOWEJ onClipEvent (keyUp) { if (Key.getCode( ) == Key.TAB) { // ustawienie kursora w polu tekstowym myTextField w _level0 Selection.setFocus("_level0.myTextField"); } } Zazwyczaj celem przechwytywania wciśnięcia klawisza Tab jest przesunięcie kursora wprowadzania tekstu do określonego pola tekstowego w formularzu. Więcej szczegółów na ten temat znajdziemy w rozdziale „Metoda Selection.SetFocus( )” w części III. Aby przechwytywać skróty klawiszowe w rodzaju Ctrl/F, posłużymy się procedurą obsługi zdarzenia klipowego enterFrame w połączeniu z metodą Key.isDown( ): onClipEvent (enterFrame) { if (Key.isDown(Key.CONTROL) && Key.isDown(70)) { // Odpowiedz na wciśnięcie Ctrl-F } } Aby przechwycić wciśnięcie klawisza Enter (Return), można skorzystać z procedury obsługi zdarzenia przyciskowego: on (keyPress "<Enter>") { // Odpowiedz na wciśnięcie Enter (na przykład wysłanie formularza) } Można także użyć procedury obsługi zdarzenia keyDown: onClipEvent (keyDown) { if (Key.getCode( ) == Key.ENTER) { // Odpowiedz na wciśnięcie Enter (na przykład wysłanie formularza) } } Więcej informacji o przechwytywaniu specjalnych klawiszy (jak klawisze funkcyjne czy klawisze z klawiatury numerycznej) znajdziemy w rozdziałach „Obiekt Key” oraz „Metoda Key.getCode( )” w części III. keyUp Zdarzenie keyUp ma miejsce, kiedy wciśnięty klawisz zostanie puszczony. Zdarzenie keyUp ma kluczowe znaczenie przy programowaniu gier — pozwala wyłączyć to, co zostało wcześniej włączone przy użyciu keyDown; klasycznym przykładem jest hamowanie statku kosmicznego. Następnym przykładem może być środowisko Flasha, gdzie wciśnięcie i przytrzymanie spacji czasowo przełącza na narzędzie Hand, zaś puszczenie spacji przywra- ca poprzednie narzędzie. Takie podejście może znaleźć zastosowanie w aplikacjach do wywoływania i ukrywania pewnych elementów (na przykład menu). Podobnie jak w przypadku keyDown, aby otrzymać od zdarzenia keyUp użyteczną infor- mację, należy je stosować w połączeniu z obiektem Key:
  • 34. Kolejność wykonywania 255 onClipEvent (keyUp) { if (!Key.isDown(Key.LEFT)) { trace("Strzałka w lewo nie jest wciśnięta"); } } Ponieważ metoda Key.isDown( ) pozwala sprawdzać stan dowolnego klawisza w dowolnej chwili, możemy użyć pętli zdarzenia enterFrame by sprawdzać, czy określony klawisz został puszczony. Niemniej jednak skanowanie klawiatury (czyli ciągłe sprawdzanie stanu klawiatury) jest mniej efektywne niż czekanie na zdarzenie keyDown, które poin- formuje nas, że klawisz został wciśnięty. Podejście ostatecznie wybrane zależy od rodzaju aplikacji, którą tworzymy. W dyna- micznej aplikacji, takiej jak gra, skanowanie może być jak najbardziej uzasadnione, ponie- waż i tak każda klatka przechodzi przez główną pętlę gry. Tak więc podczas wykony- wania normalnej pętli możemy dodatkowo sprawdzać obiekt Key. Na przykład tak: // KOD W PUSTYM KLIPIE // Pętla powodująca, ze gra działa onClipEvent (enterFrame) { _root.mainLoop( ); } // GŁÓWNY KOD GRY W GŁÓWNEJ LISTWIE CZASOWEJ // To jest wykonywane raz na ka dą wyświetloną klatkę function mainLoop ( ) { if (Key.isDown(Key.LEFT)) { trace("Strzałka w lewo jest wciśnięta"); // Obracanie statku kosmicznego w lewo } // Sprawdzanie pozostałych klawiszy, a później rozpoczęcie cyklu od nowa } W statycznej aplikacji z interfejsem nie musimy używać pętli enterFrame do sprawdzania stanu klawiszy, chyba że chcemy wychwytywać specjalne kombinacje klawiszy (czyli kilka klawiszy wciśniętych równocześnie). Zwykle powinniśmy stosować procedury obsługi zdarzeń keyDown oraz keyUp, które są wywoływane dokładnie raz dla każdego naciśnięcia i puszczenia klawisza. Używając uchwytów zdarzeń keyUp i keyDown, nie musimy zasta- nawiać się w każdej chwili, czy klawisz jest wciąż wciśnięty. Ta metoda pozwala precyzyjnie wykrywać wciskanie klawiszy, nawet jeśli użytkownik puści klawisz między klatkami; jak również zabezpiecza przed sprawdzaniem dwa razy tego samego klawisza, jeśli był on wciśnięty tylko raz. Zazwyczaj będziemy korzystać z metod Key.getCode( ) oraz Key.getAscii( ) wraz z procedurami obsługi zdarzeń keyDown i keyUp, by sprawdzić, który klawisz został wciśnięty jako ostatni. Kolejność wykonywania Niektóre aplikacje mają kod podzielony na wiele listew czasowych oraz klipowych pro- cedur obsługi zdarzeń. Nie jest więc niczym niezwykłym, że w pojedynczej klatce będzie wykonywany kod podzielony na liczne bloki znajdujące się w procedurach obsługi zda- rzeń, listwach czasowych klipów oraz głównej listwie czasowej. W takich sytuacjach ko- lejność, w jakiej różne części kodu są wykonywane, może stać się złożona i mieć poważny