r18 05 (12)


Rozdział 18.
Zarządzanie listwami czasowymi

W tym rozdziale:

W odróżnieniu od większości aplikacji do tworzenia multimediów, Flash umożliwia korzystanie z wielu listew czasowych jednocześnie. Do tej pory większość przykładów w książce zawierała tylko jedną listwę czasową i jedną scenę. Zobaczyłeś też, jak umieszczać akcje w filmach i jak sprawić, by filmy były interaktywne. Teraz pokażemy, jak można budować film z wielu listew czasowych z użyciem symboli klipów filmowych.

Klipy filmowe — elementy z niezależnymi listwami czasowymi

Jednym z najciekawszych wynalazków we Flashu są klipy filmowe, które wprowadzono już we Flashu 3. Klipy filmowe umożliwiają projektantom tworzenie złożonych zachowań elementów przez zagnieżdżanie sekwencji animacji posiadających niezależne listwy czasowe. Takie sekwencje można umieszczać w głównym filmie w postaci odrębnych modułów, których odtwarzanie nie jest powiązane z odtwarzaniem głównego filmu. Kluczem do potęgi klipów filmowych była możliwość komunikowania się i sterowania sobą nawzajem, co było realizowane za pomocą akcji Tell Target. We Flashu 4 możliwości klipów filmowych jeszcze się zwiększyły, ponieważ umożliwiono stosowanie w nich skryptów. Ta możliwość jest fundamentem dla zaawansowanej interaktywności we Flashu.

Jak oddziałują ze sobą klipy filmowe

W poprzednich rozdziałach zajmowaliśmy się filmami w postaci pojedynczej sekwencji ujęć ułożonych na pojedynczej listwie czasowej. Odtwarzanie takiej listwy czasowej mogło być liniowe (tradycyjny sposób odtwarzania) lub nieliniowe (przejścia pomiędzy ujęciami realizowane za pomocą skryptów), jednak w obu przypadkach film nadal składał się z pojedynczej listwy czasowej. Pierwotnie może się wydawać, że pojedyncza listwa czasowa zapewnia wszystko, co jest potrzebne do zrealizowania dowolnej prezentacji Flasha. Jednak w miarę wzrostu pomysłowości i ambicji szybko przekonujesz się, że niektóre plany animacji i interaktywności mogą zostać pokrzyżowane przez ograniczenia wynikające z pojedynczej listwy czasowej.

Przypuśćmy że chcesz utworzyć zapętloną animację twarzy postaci. Zakładasz, że postać powinna mrugać oczami co dwie sekundy oraz ziewać co 15 sekund. Na pojedynczej listwie czasowej musiałbyś utworzyć sekwencję o długości 180 klatek dla ziewających ust (zakładając standardową prędkość odtwarzania 12 klatek na sekundę) i powtórzyć na niej ujęcia kluczowe mrugających oczu co 24 klatki. Choć utworzenie animacji twarzy w ten sposób byłoby uciążliwe, nie byłoby niemożliwe — chyba że jednocześnie twarz musiałaby się przemieszczać na obrazie jako jeden z elementów całej postaci. Zapętlanie ruchu ust i oczu w trakcie przemieszczania ca­łej twarzy wzdłuż skomplikowanych ścieżek ruchu przez dłuższy czas szybko okazałoby się niepraktyczne, szczególnie w przypadku, gdy twarz byłaby tylko częścią otoczenia.

Teraz wyobraź sobie, że twarz postaci mógłbyś zbudować tworząc dwa zupełnie nieza­leżne filmy — jeden przedstawiający oczy, zaś drugi przedstawiający usta. Następnie mógłbyś umieścić te filmy jako samodzielne animowane obiekty na listwie czasowej głównego filmu, podobnie jak umieszczasz symbole graficzne czy przyciski. Mamy dobrą wiadomość — to jest możliwe. Do tego właśnie celu służą klipy filmowe. Klipy filmowe to niezależne sek­wencje ujęć, definiowane poza listwą czasową głównego filmu i następnie umieszczane na niej, jako obiekty w pojedynczych ujęciach kluczowych. Klipy filmowe tworzymy w taki sam sposób jak symbole graficzne (w trybie edycji symboli), lecz w odróżnieniu od symboli graficznych klipy filmowe w większości przypadków zachowują się jak samodzielne filmy SWF. Oznacza to na przykład, że skrypty ujęć działają w klipach filmowych tak samo jak w głównym filmie. Po zdefiniowaniu klipu filmowego jako symbolu, jego klony możemy umieszczać na obrazie głównego filmu lub w dowolnych innych klipach filmowych. Oto główne zasady działania klipów filmowych:

W naszym przykładzie z animowaną twarzą, animacje oczu i ust mogą być zawarte w dwóch zapętlonych klipach filmowych. Tak przygotowane klipy filmowe mogą zostać zgrupowane i wspólnie przemieszczane na obrazie (w głównej listwie czasowej), dzięki czemu uzyskamy ruch całej animowanej twarzy. To samo podejście można zastosować na przykład podczas tworzenia klipu filmowego przedstawiającego motyla, machającego skrzydłami i poruszającego się na obrazie wzdłuż ścieżki ruchu.

Jeden film, wiele listew czasowych

Pojedynczy film Flasha może zawierać wiele listew czasowych funkcjonujących równolegle na tym samym obrazie, dlatego konieczna jest metoda uporządkowania klipów filmowych na głównej listwie czasowej filmu. Podobnie jak rysunek można umieścić wewnątrz symbolu, tak i klony symboli można umieszczać (zagnieżdżać) w innych symbolach. Jeśli zmienisz wygląd zagnieżdżonego symbolu, zmieni się również wygląd jego klonu w symbolu rodzicielskim (tym, który zawiera potomny symbol). Choć może się to wydawać mało istotne, ma to ogromne znaczenie dla klipów filmowych i interaktywności Flasha. Ponieważ odtwarzanie każdego klipu filmowego jest niezależne od odtwarzania pozostałych listew czasowych, musisz poznać metodę adresowania konkretnych klipów filmowych, byś mógł nimi sterować.

Rysunek 18.1 przedstawia kilka zagnieżdżonych listew czasowych. Film Flasha składa się z dwóch warstw na głównej listwie czasowej, noszących domyślne nazwy Layer 1 i Layer 2. Pierwsza warstwa — Layer 1 — zawiera klon „A” klipu filmowego; zajmuje on 19 ujęć tej warstwy na głównej listwie czasowej. Druga warstwa — Layer 2 — zawiera klon „B” klipu filmowego; zajmuje on 10 ujęć tej warstwy na głównej listwie czasowej, a ponadto zawiera zagnieżdżony klon innego klipu filmowego (klon „C”).

0x01 graphic

Rysunek 18.1. Diagram przedstawia zagnieżdżenie listew czasowych klipów filmowych

Nawet jeśli główna listwa czasowa na rysunku 18.1 zawierałaby akcję stop(), akcja ta zatrzymywałaby jedynie odtwarzanie głównej listwy czasowej, zaś wszystkie klipy filmowe na obrazie byłyby nadal odtwarzane (chyba że również zawierałyby akcje stop() lub otrzymałyby takie polecenie z innej listwy czasowej). Gdy odtwarzana główna listwa czasowa osiągnie klatkę 20., klon klipu filmowego „A” zniknie z obrazu, niezależnie od liczby ujęć zawartych na jego listwie czasowej. Rysunek 18.2 przedstawia diagram reprezentujący zagnieżdżenie bardziej rzeczywistego zestawu klipów filmowych.

0x01 graphic

Rysunek 18.2. Za pomocą takich diagramów można przedstawiać zagnieżdżenie klipów filmowych. Diagram ten jest podobny do struktury drzewa, wyświetlanej w oknie Movie Explorer

Na rysunku 18.2 widać klony klipów filmowych. Dwa z nich, ballAnim i dog, są umieszczone na głównej listwie czasowej. Trzeci klon, dogTailAnim, jest zagnieżdżony wewnątrz klipu filmowego dog. Każdy klon na określonej listwie czasowej musi posiadać inną nazwę — na tej samej listwie czasowej nie może być dwóch obiektów o tej samej nazwie. Nazwę klonu wpisujemy w polu Name panelu Instance (rysunek 18.3).

0x01 graphic

Rysunek 18.3. W polu Name panelu Instance wpisujemy nazwę klonu klipu filmowego

Teraz, gdy wiesz już w jaki sposób wiele listew czasowych może współistnieć w jednym filmie, zobaczmy jak poszczególne klony klipów filmowych mogą komunikować się między sobą.

Przeprowadzka z Flasha 4 do Flasha 5 — ścieżki adresowe

Klipy filmowe poznałeś już w rozdziale 9., „Biblioteka Flasha — symbole i klony”, dlatego prawdopodobnie wiedziałeś już, że są one rozwiązaniem dla naszego problemu animowanej twarzy. Możesz jednak nie wiedzieć, że klipy filmowe mogą również wprowadzić logikę do animacji i interfejsów w filmach Flasha. Spójrzmy jeszcze raz na nasz przykład z animowaną twarzą — gdy człowiek ziewa, zwykle automatycznie zamyka oczy na czas ziewania. Twarz naszej hipotetycznej postaci mogłaby wyglądać dziwnie, gdyby mrugała i ziewała w tym samym czasie. Przypuśćmy, że chcemy sprawić, by oczy postaci pozostawały zamknięte podczas ziewania. Musimy utworzyć jakiś mechanizm, za pomocą którego klip filmowy ust będzie sterował klipem filmowym oczu, zlecając mu przejście do stanu (ujęcia) „zamkniętego”, gdy usta się otwierają, a następnie powrót do pętli mrugania, gdy usta się zamykają.

Mechanizm sterowania klipem oczu przez klip ust możemy utworzyć na kilka sposobów. We Flashu 3 i Flashu 4 sterowanie listwami czasowymi przez inne listwy czasowe (zarówno listwy klipów filmowych jak i głównego filmu) było realizowane za pomocą akcji Tell Target. W jaki sposób? Akcja Tell Target zawierała adres listwy czasowej, do której wysyłała określone akcje. We Flashu 5 nadal jest dostępna akcja Tell Target, lecz teraz możesz również wysyłać akcje do określonych listew czasowych, dołączając je w postaci metod do obiektów typu Movie Clip. Jeśli tworzenie skryptów jest dla ciebie nowością, przeczytaj ramkę „Nowy lepszy ActionScript”.

Akcja Tell Target jest we Flashu 5 oznaczona jako wycofywana — Flash 5 nadal obsługuje tę akcję, lecz jednocześnie oferuje doskonalsze i bardziej uniwersalne sposoby adresowania obiektów. Więcej informacji na temat wycofywanych akcji znajdziesz w ramce „Akcje wycofywane i akcje niekompatybilne” w poprzednim rozdziale. W tym rozdziale pokażemy zarówno jak używać akcji Tell Target, jak i nowego sposobu adresowania Flasha 5. Wcześniej jednak musisz zrozumieć, na czym polega adresowanie w filmach Flasha.

(((początek szarego tła)))

Nowy lepszy ActionScript

We Flashu 5 wprowadzono nowy sposób zapisu akcji, zwany notacją kropkową. Wcześniejsze wersje Flasha używały bardziej naturalnego zapisu z użyciem ukośników, zaczerpniętego ze ścieżek dostępu w strukturze plików z ich katalogami i podkatalogami. Choć większość użytkowników preferuje łatwe w użytkowaniu środowiska skryptowe, wymagania produkcyjne złożonych projektów wymusiły zastosowanie takiej notacji ukośnikowej. Programiści komputerowi w naturalny sposób preferują tworzenie, edycję i modyfikowanie skryptów z użyciem języka, który jest im już znany i który mogą z łatwością analizować i modyfikować. W konsekwencji Flash 5 łączy wszystko co najlepsze w tych dwóch podejściach.

Język ActionScript Flasha 5 został utworzony na bazie specyfikacji ECMA-262, która z kolei powstała na podstawie języka JavaScript — uniwersalnego języka skryptowego, obsługiwanego przez większość przeglądarek internetowych i zawartego w większości interaktywnych dokumentów HTML i DHTML. Z tego też powodu w języku ActionScript wprowadzono notację kropkową. Co to oznacza? Oznacza to, że teraz wszystkie akcje zapisujemy z użyciem standardowej składni języków programowania zorientowanych obiektowo:

Obiekt.właściwość = wartość;

lub

Obiekt.metoda();

Powyższe dwa przykłady wymagają zdefiniowania czterech elementów: obiektu, właściwości, metody i wartości. Obiekt to każdy element programu (czy w tym przypadku filmu Flasha), który posiada dostępne i modyfikowalne właściwości. Obiekt może być zdefiniowany przez użytkownika (innymi słowy możesz go utworzyć i nadać mu nazwę) lub może być predefiniowany w programie. Flash posiada kilka predefiniowanych obiektów, co oznacza że są już one wbudowane w język ActionScript. Obu typom obiektów przyjrzymy się w następnych rozdziałach. Jednym z najważniejszych obiektów (i chyba najłatwiejszych do wyobrażenia) jest obiekt typu Movie Clip (klip filmowy). Każdy klon klipu filmowego na obrazie jest obiektem — są nimi na przykład klony ballAnim i dogTailAnim z naszego poprzedniego przykładu. Obiekt posiada cechy — inaczej zwane właściwościami — które można odczytywać, aktualizować i modyfikować w filmie. Przykładem właściwości klipu filmowego jest jego skala, reprezentowana przez właściwości _xscale (skala w osi X) i _yscale (skala w osi Y). W następnym rozdziale omówimy poszczególne właściwości klipów filmowych. Każda właściwość obiektu posiada swoją wartość. Odnosząc się do tego samego przykładu, gdy klip filmowy jest wyświetlany w pierwotnej skali, jego właściwości _xscale i _yscale mają wartości 100 (skala jest wartością procentową). W przypadku klonu klipu filmowego o nazwie ballAnim moglibyśmy zapisać to następująco:

ballAnim._xscale = 100;

ballAnim._yscale = 100;

Wreszcie wobec obiektów możemy stosować pewne operacje, które w określony sposób wpływają na ich zachowanie. Te operacje nazywamy metodami. Jedną z metod obiektu typu Movie Clip jest metoda gotoAndPlay(), która działa tak samo jak akcja gotoAndPlay() opisana w poprzednim rozdziale. We Flashu 5 możesz samodzielnie definiować metody obiektów, istnieje też duża liczba predefiniowanych metod dla istniejących już obiektów Flasha. Dowolną akcję z kategorii Basic Action można dołączyć jako metodę do klonu klipu filmowego, w następujący sposób:

ballAnim.gotoAndPlay("start");

Powyższy przykład zleca klonowi klipu filmowego o nazwie ballAnim przejście do ujęcia opatrzonego etykietą start (na jego listwie czasowej). W tym rozdziale dowiesz się, jak korzystać z metody gotoAndPlay() obiektów typu Movie Clip.

(((koniec szarego tła)))

Ścieżki absolutne i ścieżki relatywne

We wcześniejszej części tego rozdziału dowiedziałeś się, w jaki sposób w jednym filmie może współistnieć wiele listew czasowych klipów filmowych. Bez problemu można na przykład zagnieździć kilka klipów filmowych wewnątrz innego klipu filmowego. Aby zrozumieć, w jaki sposób klipy filmowe komunikują się między sobą, musisz zrozumieć jak działają ścieżki adresowe. Ścieżka adresowa opisuje, w jaki sposób „dostać się” do konkretnego klonu klipu filmowego — czyli przez jakie pośrednie obiekty (inne klipy filmowe) trzeba „przejść” by do niego dotrzeć. Jeśli klon klipu filmowego o nazwie dogTailAnim jest zagnieżdżony wewnątrz klonu klipu filmowego o nazwie dog, jak do niego dotrzeć? I co zrobić jeśli film zawiera więcej klonów o nazwie dogTailAnim, zagnieżdżonych w innych klipach filmowych (innych niż dog)? Każdy klon klipu filmowego możesz zaadresować z dowolnego miejsca tej struktury, stosując absolutną lub relatywną ścieżkę adresową.

Absolutna ścieżka adresowa podaje pełną informację o usytuowaniu określonego klonu klipu filmowego w hierarchii klipów. Dowolny adres pocztowy zawiera kod pocztowy miejscowości, nazwę ulicy, numer domu i mieszkania, by z dowolnego miejsca kraju można było odnaleźć konkretne mieszkanie. Podobnie absolutna ścieżka adresowa zawiera pełną informację o usytuowaniu klipu filmowego, odniesioną do głównej listwy czasowej filmu. We wcześniejszych wersjach Flasha główna listwa czasowa była reprezentowana w ścieżkach adresowych przez ukośnik / na początku ścieżki. Na przykład absolutna ścieżka klonu klipu filmowego dog umieszczonego na głównej listwie czasowej wyglądałaby w tym zapisie tak:

/dog

Aby zaadresować klon klipu filmowego zagnieżdżony wewnątrz klonu dog za pomocą ścieżki absolutnej, do powyższej ścieżki dołączylibyśmy następny człon. Na przykład, jeśli klon dog zawierałby zagnieżdżony klon dogTailAnim, absolutna ścieżka adresowa klonu dogTailAnim wyglądałaby tak:

/dog/dogTailAnim

Poszczególne człony ścieżki adresowej, czyli nazwy klonów, w starym zapisie były oddzielane ukośnikiem /. Zapis ścieżek adresowych z użyciem ukośników nazywamy notacją ukośnikową.

We Flashu 5 nadal możesz stosować notację ukośnikową, lecz idąc z duchem czasów z pewnością zdecydujesz się na stosowanie nowocześniejszej i bardziej uniwersalnej notacji kropkowej. W notacji kropkowej główna listwa czasowa jest reprezentowana przez słowo kluczowe _root.

_root

Korzystając nadal z tego samego przykładu, klon klipu filmowego dog umieszczony na głównej listwie czasowej ma taką absolutną ścieżkę adresową:

_root.dog

Idąc dalej za tym samym przykładem, absolutna ścieżka klonu dogTailAnim, zagnieżdżonego wewnątrz klonu dog, wygląda następująco:

_root.dog.dogTailAnim

Podobnie jak akcja Tell Target jest we Flashu 5 oznaczona jako wycofywana, tak i notacja ukośnikowa jest w tej wersji uważana za wycofywaną. Obie konwencje są nadal obsługiwane przez Flasha 5 i jego odtwarzacz Flash 5 Player, lecz następne wersje Flasha będą współpracowały tylko z nowocześnieją notacją kropkową.

Relatywna ścieżka adresowa podaje położenie klonu w hierarchii klipów filmowych w odniesieniu do aktualnego miejsca w tej hierarchii (czyli miejsca, w którym układamy tę ścieżkę). --> Dla porównania przypuśćmy, że do twoich drzwi dzwoni osoba szukająca starego kolegi ze szkoły, który to kolega mieszka dwa piętra nad tobą. W takim przypadku wystarczy informacja „dwa piętra wyżej” (odpowiednik ścieżki relatywnej) — nie musisz podawać całego adresu, łącznie z kodem pocztowym i nazwą ulicy (który byłby odpowiednikiem ścieżki absolutnej). Podajesz położenie obiektu w odniesieniu do miejsca, w którym się aktualnie znajdujesz.[Author:MB]

We Flashu relatywne ścieżki adresowe są przydatne w przypadku klipów filmowych, wewnątrz których jest zagnieżdżonych klika innych klipów filmowych. Korzystając z relatywnych ścieżek adresowych możesz przechodzić do kolejnych rodzicielskich klonów klipów filmowych i za pomocą tej samej ścieżki relatywnej odnosić się do różnych zagnieżdżonych w nich klipów potomnych. Podobnie jak w przypadku ścieżek absolutnych, relatywne ścieżki adresowe możemy zapisywać stosując notację ukośnikową lub notację kropkową. Aby zaadresować listwę czasową, która jest rodzicielska dla aktualnej listwy czasowej, stosujemy następujący zapis ukośnikowy:

../

Dwie kropki oznaczają przejście o jeden poziom wyżej w hierarchii klipów filmowych (podobnie jak w systemach plików oznaczają przejście do katalogu rodzicielskiego). Stosując relatywne ścieżki w notacji ukośnikowej, możesz poruszać się w tej samej ścieżce w górę i w dół hierarchii. Na przykład, jeśli na tym samym poziomie hierarchii są zagnieżdżone dwa klony klipów filmowych, dogTailAnim i dogPantingAnim, w tym samym rodzicielskim klonie klipu filmowego dog, możesz przejść z klonu dogPantingAnim do klonu dogTailAnim za pomocą następującej ścieżki relatywnej:

../dogTailAnim

Ta relatywna ścieżka oznacza, że z aktualnej listwy czasowej należy przejść do listwy rodzicielskiej, a następnie w niej odszukać i wejść do klonu o nazwie dogTailAnim.

W notacji kropkowej relatywna ścieżka adresowa rodzicielskiej listwy czasowej jest reprezentowana przez słowo kluczowe _parent:

_parent

Aby zaadresować klon klipu filmowego zagnieżdżony na tej samej listwie czasowej co aktualny klon klipu filmowego, stosując notację kropkową, po słowie kluczowym _parent podajemy nazwie docelowego klonu:

_parent.dogTailAnim

Podobnie jak w przypadku ścieżek absolutnych, zalecamy byś stosował notację kropkową w relatywnych ścieżkach adresowych.

Dobrze, wystarczy teorii. Pozwólmy teraz, by Colin Moock ułatwił nam przestawienie się z notacji ukośnikowej Flasha 4 na notację kropkową Flasha 5. Colin pokaże, jak używał akcji Tell Target i klipów filmowych do utworzenia GWEN! — gwiazdy animowanej serii, dostępnej na jego witrynie. (Jeśli chcesz zobaczyć więcej animacji z udziałem GWEN! po zakończeniu ćwiczenia, odwiedź stronę www.moock.org/gwen/). Zwróć uwagę, że ćwiczenie Colina zostało zaktualizowane w stosunku do poprzedniej wersji książki, i teraz zawiera elementy związane z tworzeniem skryptów klipów filmowych we Flashu 5. Sama procedura pozostała taka sama. Oprócz oczywistej wartości opisanej metodologii, ćwiczenie to jest również przykładem przeniesienia materiałów Flasha 4 do Flasha 5. Jak jednak zobaczysz w dalszej części rozdziału, Flash 5 oferuje nowe techniki adresowania obiektów.

(((cd-rom))) Aby wykonać to ćwiczenie eksperta, otwórz plik gwen.fla, zawarty na naszym CD-ROM-ie w katalogu ch18/colin_moock. Aby obejrzeć rezultat ćwiczenia, otwórz plik gwen-finished.fla, zawarty w tym samym katalogu.

(((początek szarego tła)))

Ćwiczenie eksperta:
GWEN! Zamyka oczy podczas ziewania
Autor: Colin Moock

W tym ćwiczeniu Colin korzysta z akcji tellTarget, kompatybilnej z Flashem 4, realizując za jego pomocą komunikację pomiędzy listwami czasowymi filmu. Jeśli chcesz zachować kompatybilność wstecz z Flashem 4, nie możesz stosować notacji kropkowej w połączeniu z akcjami kierowanymi do klipów filmowych (na przykład, akcja _root.nazwaKlonu.gotoAndStop() nie zadziała, gdy film będzie odtwarzany przez odtwarzacz Flash 4 Player). Choć możesz używać notacji kropkowej w ścieżkach adresowych klonów klipów filmowych, jednak akcje musisz wysyłać do tych klonów za pomocą akcji tellTarget, jeśli chcesz, by film był kompatybilny z Flashem 4.

GWEN! powstała jako animacja Flasha 2. W części pierwszej („Episode One”) raczej rzadko mruga­ła oczami i w ogóle nie ziewała. W czasie, gdy niemal gotowa była druga część („Episode Two”), pojawił się Flash 3 i GWEN! z radością powitała klipy filmowe i akcję Tell Target. Teraz, gdy GWEN! stała się znacznie bardziej przekonywująca, zgodziła się na mały demontaż, dzięki czemu możesz zobaczyć, jak działają jej oczy i usta. W tym ćwiczeniu pokażemy, w jaki sposób możesz z powrotem zmontować jej twarz. Nie martw się GWEN!, to nie będzie bolało!

Rozpocznij od otwarcia pliku gwen.fla (znajduje się on w katalogu ch18/colin_moock na CD-ROM-ie). Otwórz bibliotekę filmu gwen.fla, wybierając polecenie Window/Library. W bibliotece znajdziesz pięć symboli oraz jeden folder: gwen's face (twarz GWEN!), gwen's eyes (oczy), gwen's eyes shut (zamknięte oczy), gwen's mouth (usta) gwen's mouth open (otwarte usta GWEN!) oraz folder face artwork (rysunki elementów twarzy). Przeciągnij z biblioteki na obraz klon symbolu graficznego gwen's face, pokazanego na poniższym rysunku.

0x01 graphic

Rysunek: Symbol graficzny gwen's face

Teraz utworzymy klip filmowy przedstawiający mrugające oczy GWEN! Utwórz nowy klip fil­mo­wy, wybierając polecenie Insert/New Symbol. W oknie dialogowym Symbol Pro­per­ties wprowadź nazwę eyes (oczy) i w polu Behavior pozostaw zaznaczoną domyślną opcję Movie Clip, jak na poniższym rysunku. Klik­nij OK.

0x01 graphic

Rysunek: Wpisz nazwę symbolu i pozostaw domyślny typ symbolu — Movie Clip (klip filmowy)

Gdy klikniesz przycisk OK w oknie dialogowym Symbol Properties, program automatycznie przejdzie do trybu edycji symboli, gdzie rozpoczniesz pracę nad klipem filmowym. Zmień nazwę warstwy Layer 1 na eyes blinking (mrugające oczy). Kliknij w tej warstwie klatkę numer 24 i wy­bierz polecenie Insert/Frame. Pozostając nadal w ujęciu numer 24, wybierz polecenie Insert/Blank Keyframe, by utworzyć puste ujęcie kluczowe. Ujęcie kluczowe możesz też utworzyć zaznaczając klatkę 24. i naciskając klawisz F7 (patrz następny rysunek).

0x01 graphic

Kliknij 1. ujęcie i przeciągnij na obraz klon symbolu gwen's eyes. Gdy klon tego symbolu jest zaznaczony, otwórz panel Align (klawisze Ctrl+K lub Command+K). Wyśrodkuj klon symbolu na obrazie — kliknij ikonę To Stage, a następnie w polu Align kliknij ikony Align horizontal center i Align vertical center (patrz następny rysunek).

0x01 graphic

Rysunek: Użyj nowego panelu Align do wyśrodkowania klonu na obrazie

Kliknij ujęcie numer 24 i przeciągnij na obraz klon symbolu gwen's eyes shut. Wyśrodkuj klon na obrazie, podobnie jak w poprzednim kroku.

0x01 graphic

Rysunek: Przeciągnij na obraz klon symbolu gwen's eyes shut

Teraz musimy opatrzyć etykietą ujęcie przedstawiające zamknięte oczy, dzięki czemu skrypt będzie mógł przejść do tego ujęcia, gdy GWEN! otworzy usta. Do­daj no­wą warstwę wybierając polecenie Insert/Layer. Nadaj nowej warstwie nazwę Labels (etykiety). Etykiety zawsze powinno się umieszczać w osobnej warstwie. Kliknij klatkę nu­mer 24 na warstwie Labels i wybierz polecenie Insert/Blank Keyframe (lub naciśnij klawisz F7). Otwórz panel Frame, wy­bierając pole­ce­nie Modify/Frame (lub naciskając klawisze Ctrl+F lub Command+F). W polu Label wpisz nazwę etykiety shut (jak na następnym rysunku). Potwierdź wprowadzenie nazwy, wciskając klawisz Enter.

0x01 graphic

Rysunek: W akcji Go To lepiej adresować ujęcia za pomocą etykiet, niż za pomocą numerów ujęć

Animacja oczu jest gotowa, przejdźmy więc do animacji ust. Utwórz nowy klip filmowy, wybierając pole­cenie Insert/New Symbol. W oknie dialogowym Symbol Properties wprowadź nazwę mouth (usta); w polu Behavior pozostaw zaznaczoną opcję Movie Clip, jak na następnym rysunku. Kliknij OK.

0x01 graphic

Rysunek: Wpisz nazwę symbolu i pozostaw domyślny typ symbolu — Movie Clip

Podobnie jak wcześniej, program automatycznie przejdzie do trybu edycji symbolu, czyli nowo utworzonego klipu filmowego. Nadaj pierwszej warstwie nazwę Mouth Yawning (ziewające usta). Kliknij klatkę numer 180 tej warstwy i wybierz polecenie Insert/Frame. Kliknij klatkę numer 160 i wybierz polecenie Insert/Blank Keyframe.

0x01 graphic

Rysunek: Wypracuj sobie nawyk tworzenia „przestrzeni” na listwie czasowej, przygotowując dużą liczbę ujęć na materiały Flasha

Kliknij 1. ujęcie i przeciągnij na obraz klon symbolu gwen's mouth. Gdy klon jest zaznaczony, otwórz panel Align. Wyśrodkuj klon symbolu na obrazie, podobnie jak zrobiłeś z poprzednimi klonami.

0x01 graphic

Kliknij 160. ujęcie i przeciągnij na obraz klon symbolu gwen's mouth open. Za pomocą panelu wyśrodkuj klon na obrazie, jak na następnym rysunku.

0x01 graphic

Rysunek: Przeciągnij na obraz klon symbolu gwen's mouth open i wyśrodkuj go za pomocą panelu Align

Czas umieścić oczy i usta na twarzy GWEN! Wróć do edycji głównego filmu, wybierając polecenie Edit/Edit Movie (klawisze Ctrl+E lub Command+E). Utwórz dwie nowe warstwy i nadaj im nazwy eyes (oczy) i mouth (usta). Przeciągnij z biblioteki nowoutworzone symbole klipów filmowych eyes i mouth, i umieść je na twarzy GWEN!, jak na następnym rysunku. Przed przeciągnięciem każdego symbolu na obraz upewnij się, że jest zaznaczona odpowiadająca mu warstwa.

--> 0x01 graphic
[Author:MB]

Rysunek: Przeciągnij na obraz symbole oczu i ust, i umieść je na twarzy GWEN!

W tym momencie na obrazie znajduje się już gotowa animacja dziewczęcej twarzy. Jeśli od­tworzysz teraz film, zobaczysz mrugające oczy GWEN! oraz jej ziewające usta; musimy jednak utworzyć interaktywny mechanizm, dzięki któremu usta będą sterowały za­mykaniem i otwieraniem oczu. Aby to zrobić, rozpoczniemy od nadania nazwy utworzo­nemu i przeciągniętemu na obraz klonowi klipu filmowego oczu (eyes), dzięki czemu będzie on mógł być identyfikowany przez klon klipu filmowego ust (mouth). Następnie dodamy akcje Tell Target, które będą sterowały oczami. Trzymaj się GWEN!, jesteśmy już prawie gotowi!

Zaznacz na obrazie klip filmowy eyes (oczy) i otwórz panel Instance za pomocą polecenia Modify/Instan­ce (klawisze Ctrl+I lub Command+I). W panelu Instance widnieje pole tekstowe Name (następny rysunek). W tym polu wpiszemy nazwę klonu klipu filmowego, która stanie się jego identyfikatorem. Nazwy klonów to coś w rodzaju nume­rów seryjnych — pozwalają one akcjom w filmie odnosić się do określonych kopii klipu fil­mowego. Wpisz w polu tekstowym nazwę her-eyes (jej oczy) i naciśnij klawisz Enter.

--> 0x01 graphic
[Author:MB]

Rysunek: Pole Name w panelu Instance zawiera nazwę klonu

Pamiętaj, że wszelkie symbole (w tym klipy filmowe) umieszczone na obrazie są jedy­nie klonami symboli z biblioteki. Dlatego też nadajemy nazwę klonowi symbolu na ob­razie, a nie odnosimy się do niego za pomocą nazwy z biblioteki. Dzięki temu możesz umieś­cić na obrazie wiele klonów oczu GWEN! i nadać im wszystkim różne nazwy, co umożliwi niezależne sterowanie i manipulowanie nimi. W przypadku oczu rezultaty mogą być nieco zabawne… rzuć okiem na drugą część „Episode Two” animacji GWEN!, pod adresem www.moock.org/gwen/.

Teraz, gdy nadaliśmy klonowi klipu filmowego nazwę her-eyes, możemy wrócić do klonu ust i umieścić w nim akcję Tell Target, sterującą klonem her-eyes. Anuluj wszelkie zaznaczenia, klikając pus­ty obszar obrazu, po czym zaznacz jedynie klon symbolu ust. Wybierz polecenie Edit/ Edit Selected, aby powrócić do pracy nad klipem filmowym ust. Dodaj nową warstwę wybierając polecenie Insert/Layer. Nadaj nowej warstwie nazwę Actions. Ak­cje powinny być zawsze umieszczane w oddzielnej warstwie.

Uwaga autora: Zaznaczenie możesz również anulować naciskając klawisz Esc.

Kliknij klatkę numer 160 na warstwie Actions i wybierz polecenie Insert/Blank Keyframe. Następnie otwórz edytor skryptów Frame Actions przez dwukrotnie kliknięcie ujęcia kluczowego numer 160, lub przez kliknięcie go prawym klawiszem myszy (lub z przytrzymaniem klawisza Ctrl na Macintoshu) i wybranie z podręcznego menu polecenia Actions. W edytorze skryptów kliknij ikonę + (plus) i wybierz akcję Tell Target z kategorii Basic Actions, jak na następnym rysunku. W dolnej części edytora skryptów, w polu tekstowym Target wprowadź ścieżkę /her-eyes. Od tej chwili każda akcja zagnieżdżona wewnątrz akcji Tell Target (czyli umieszczona pomiędzy jej klamrami), zostanie przesłana do klonu klipu filmowego o nazwie her-eyes, umieszczonego na głównej listwie czasowej. Możemy umieścić pomiędzy klamrami akcję sterującą odtwarzaniem klonu her-eyes.

0x01 graphic

Rysunek: Edytor skryptów Frame Actions

Gdy w oknie skryptu jest podświetlona linia tellTarget("/her-eyes"), kliknij ikonę + (plus) i wybierz akcję Go To z kategorii Basic Actions. W polu Type wybierz opcję Frame Label i w polu teks­to­wym Frame wpisz nazwę etykiety shut. Wyłącz opcję Go to and Play, jak na następnym rysunku. Akcja ta spowoduje przejście klipu filmowego her-eyes do ujęcia opatrzonego etykietą shut i pozostanie w nim aż do czasu nadej­ścia nowego polecenia.

0x01 graphic

Rysunek: Parametry akcji Go To w dolnej części edytora skryptów

Okno skryptu powinno zawierać teraz następujący skrypt:

tellTarget ("/her-eyes"){
gotoAndStop ("shut");

}

Kliknij klatkę numer 180 na warstwie Actions i wybierz polecenie Insert/Blank Keyframe. Następnie otwórz edytor skryptów Frame Actions przez dwukrotnie kliknięcie ujęcia kluczowego numer 180, lub przez kliknięcie go prawym klawiszem myszy (lub z przytrzymaniem klawisza Ctrl na Macintoshu) i wybranie z podręcznego menu polecenia Actions. W edytorze skryptów kliknij ikonę + (plus) i wybierz akcję Tell Target z kategorii Basic Actions. W polu tekstowym Target wprowadź ścieżkę /her-eyes, jak na poniższym rysunku. Gdy w skrypcie jest zaznaczona linia tellTarget("/her-eyes"){, kliknij ikonę + (plus) i wybierz akcję Play z kategorii Basic Actions. Ten skrypt sprawi, że GWEN! wróci do mrugania po zakończeniu ziewania.

0x01 graphic

Rysunek: Ten prosty zestaw akcji przywraca odtwarzanie klonu her-eyes

To wszystko. Przetestuj film, wybierając polecenie File/Publish Preview/Flash lub Control/Test Movie (klawisze Ctrl+Enter lub Command+Enter). Powinieneś zobaczyć, jak oczy GWEN! zamykają się podczas ziewa­nia. Jeśli coś nie działa tak, jak się tego spo­dziewałeś, porównaj swoją pracę z ukończoną wersją animacji GWEN!, umieszczoną w pliku gwen-finished.fla w katalogu ch18/colin_moock na naszym CD-ROM-ie.

Końcowa rada: akcja Tell Target może być nieco wybredna — zawsze sprawdzaj, czy nazwy wpisane w polu Target zgadzają się z nazwami klonów, czy odpowiadają usytuowaniu w hierarchii listew czasowych i czy te są odpowiednio opisane. Na początku może ci się przydarzyć kilka błędów, lecz w większości przypadków znalezienie przyczyn problemu nie powinno być trudne. Jeśli chcesz bliżej poznać GWEN!, odwiedź ją na stronie www.moock.org/gwen/. Jest trochę przemądrzała, lecz kto wie… teraz, kiedy wiesz jak działa, być może poświęci ci więcej uwagi. Nie zapomnij uszczypnąć jej w policzek.

(((przypis do szarego tła)))

Próbowaliśmy zadać Colinowi te same pytania, które zadawaliśmy innym autorom ćwiczeń eksperta, jednak Colin okazał się być mistrzem wymijających odpowiedzi. Pierwszy raz spotkał się z Flashem, gdy „firma Futurewave przesłała mi e-mailem próbną wersję programu, gdy współpracowałem z firmą Softquad (twórcą programu Hotmetal Pro)”. Gdy zapytaliśmy go o pamiętny film lub piosenkę z czasów, gdy kończył szkołę średnią, Colin stwierdził, że nie pamięta. Gdy wyjaśniliśmy, że staramy się nie podawać wieku współtwórców naszej książki, lecz zamiast tego określać go za pomocą znanych utworów kojarzących się z określonym rokiem, on uparcie stwierdził „Naprawdę, w tym czasie nie oglądałem filmów ani nie słuchałem piosenek”. Colin Moock uchylił się więc przed udzieleniem nam informacji o sobie. Możemy powiedzieć tylko tyle, że mieszka w Toronto, jest szanowanym ekspertem Flasha i pracował nad wieloma znanymi witrynami Flasha. Jego projekty możesz obejrzeć pod adresami www.moock.org/webdesign/portfolio i www.moock.org/webdesign/flash/sandbox.

(((koniec szarego tła)))

Tworzenie interfejsów za pomocą akcji Tell Target i klipów filmowych

Przedstawiony film z GWEN! w głównej roli stanowi przykład zastosowania akcji Tell Target w celu wzbogacenia animacji. Tę samą technikę można stosować również w celu two­rzenia interfejsów. Akcje Tell Target związane z interfejsami często spotykamy w przy­ciskach. Tak jak używaliśmy akcji Tell Target z innymi akcjami w ujęciach kluczowych w ćwiczeniu Colina, podobnie możemy używać akcji Tell Target w połączeniu z inny­mi akcjami w przyciskach. Wiosną 1999 roku Colin, jako pracownik ICE, stworzył we Flashu większą część interaktywnego CD-ROM-u dla encyklopedii McClelland & Ste­ward's „The Canadian Encyclopedia 1999”. Większość interaktywnych elementów in­tensywnie korzystała z klipów filmowych i akcji Tell Target. Prostym, typowym przykładem zastosowania akcji Tell Target w celu wzbogacenia interfejsu jest strona Retrospective: Canadian Painting encyklopedii, pokazana na rysunku 18.4.

0x01 graphic

Rysunek 18.4. Strona „Retrospective: Canadian Painting” z encyklopedii „The Canadian Encyclopedia 1999”

Rysunek 18.4 przedstawia tę stronę w akcji. Miniatury obrazów są pokazywane na swego rodzaju karu­zeli, która jest poruszana przez użytkownika za pomocą prawej i lewej strzałki. Pod ka­ruzelą znajduje się okno informacyjne wyświetlające tytuł obrazu, datę i informacje o artyście, po umieszczeniu kursora nad wybraną miniaturą. Okno informacyjne jest kli­pem filmowym posiadającym po jednym ujęciu z opisem dla każdego obrazu. Wszystkie miniatury obrazów na karuzeli są przyciskami. Gdy użytkownik wskazuje obraz, detek­tor zdarzenia rollOver przycisku uruchamia akcję Tell Target, powodującą wyświet­lenie w klipie filmowym odpowiedniego ujęcia, zawierającego informacje na temat da­nego obrazu. Nawet gdy obrazy przemieszczają się na karuzeli, okno informacyjne nie zmienia zawartości, ponieważ jest to oddzielny klip filmowy, a nie fragment miniaturek.

Adresowanie klipów filmowych we Flashu 5

W języku ActionScirpt Flasha 5 wprowadzono nową składnię, która sama w sobie stanowi nowy sposób adresowania klonów klipów filmowych. W poprzednim podrozdziale poznałeś różnice pomiędzy notacją ukośnikową i notacją kropkową, zarówno w absolutnych jak i relatywnych ścieżkach adresowych. W ćwiczeniu eksperta dowiedziałeś się, jak za pomocą notacji ukośnikowej i akcji tellTarget możesz sterować klipami filmowymi. Teraz pokażemy, jak za pomocą nowocześniejszej notacji kropkowej i języka ActionScript Flasha 5 sprawić, by klipy filmowe wzajemnie na siebie oddziaływały.

(((ostrzeżenie))) Jeśli chcesz, by filmy Flasha były kompatybilne z odtwarzaczem Flash 4 Player, powinieneś pozostać przy używaniu akcji tellTarget. Metody opisywane w tym podrozdziale współpracują jedynie z odtwarzaczem Flash 5 Player (i będą współpracowały z jego przyszłymi wersjami).

Tworzymy biblioteki dźwiękowe z udziałem klipów filmowych

W rozdziałach 14., 15., i 16. poznałeś tajniki importowania i stosowania dźwięku w filmach Flasha. W tym podrozdziale pokażemy, jak tworzyć dźwiękowe klipy filmowe, zagnieżdżone wewnątrz większego klipu filmowego będącego swego rodzaju biblioteką dźwięków. Korzystając z takich bibliotek dźwięków w postaci klipów filmowych, możesz z łatwością przenosić całe zestawy dźwięków pomiędzy listwami czasowymi filmu, a nawet pomiędzy różnymi filmami Flasha. W tym podrozdziale dowiesz się, jak ważne jest:

Te reguły pracy są dosyć zrozumiałe i łatwo się do nich dostosować.

(((cd-rom))) Na naszym CD-ROM-ie, w katalogu ch18/pianoKeys/sounds znajdziesz pliki dźwiękowe, które będą ci potrzebne w tym ćwiczeniu. W podkatalogu pc umieszczono pliki dźwiękowe w formacie .WAV dla komputerów PC, zaś w podkatalogu mac umieszczono te same dźwięki zapisane w formacie .AIF dla komputerów Macintosh. W ćwiczeniu możesz rozpocząć pracę od otwarcia pliku ch18/pianoKeys/pianoKeys_starter.fla lub jednego z własnych filmów.

Klip filmowy pianoKeys

Otwórz plik pianoKeys_starter.fla zawarty w katalogu ch18/pianoKeys na naszym CD-ROM-ie. Na obrazie tego filmu jest umieszczony klon klipu filmowego pianoKeys. Kliknij dwukrotnie ten klon, aby przejść do trybu edycji jego symbolu (rysunek 18.5).

0x01 graphic

Rysunek 18.5. Listwa czasowa klipu filmowego pianoKeys

Listwa czasowa klipu filmowego pianoKeys zawiera dużą liczbę warstw, wśród których znajdują się warstwy przycisków i warstwy przeznaczone na etykiety ujęć. Przetestuj film, wybierając polecenie Control/Test Movie (klawisze Ctrl+Enter lub Command+Enter). Zauważysz, że poszczególne klony przycisków, umieszczone nad poszczególnymi klawiszami pianina, zlecają Flashowi przejście do ujęcia listwy czasowej, w którym odpowiadający im klawisz pianina jest wyświetlany jako wciśnięty. Ujęcia przedstawiające wciśnięte klawisze pianina są opatrzone etykietami na listwie czasowej. Przycisk keyButton_1, umieszczony nad pierwszym klawiszem od lewej, zawiera następujący skrypt:

on (press, keyPress "a") {

gotoAndStop ("key_1");

}

on (rollOver) {

gotoAndStop ("keys_full");

}

Ten skrypt nie zawiera ani jednej akcji tellTarget — zawiera jedynie proste akcje nawigacyjne, które poznałeś w poprzednim rozdziale. Gdy użytkownik kliknie klon przycisku keyButton_1 za pomocą myszy, Flash przejdzie do ujęcia opatrzonego etykietą key_1 na aktualnej listwie czasowej, czyli na listwie klipu filmowego pianoKeys. Gdy nie stosujemy adresowania, wszystkie akcje klonu przycisku dotyczą tej listwy czasowej, na której znajduje się ów przycisk.

Najniższa warstwa klipu — warstwa keysFull — zawiera bitmapę pianoKeys_full.png, przedstawiającą fragment klawiatury pianina, na którym nie jest wciśnięty żaden klawisz. Po przejściu do ujęcia key_1, bitmapa z warstwy keysFull zostaje częściowo zasłonięta przez inną bitmapę (key_01.png na warstwie keys), w wyniku czego na obrazie widzimy wciśnięcie pierwszego klawisza pianina. Zwróć uwagę, że bitmapa pianoKeys_full.png jest wyświetlana we wszystkich ujęciach listwy czasowej pianoKeys. Poszczególne klony przycisków w klipie filmowym pianoKeys zawierają skrypty, które wykonują przejścia do odpowiednich etykiet na listwie czasowej, dzięki czemu za każdym razem widzimy wciśnięcie odpowiedniego klawisza.

Gdy rozumiesz już procesy zachodzące w tym klipie filmowym, utwórzmy nowy, dźwiękowy klip filmowy, którym będziemy mogli sterować za pomocą klipu pianoKeys.

Tworzenie dźwiękowych klipów filmowych

Zanim przystąpimy do tworzenia symboli klipów filmowych, musimy ustalić pewną konwencję, zgodnie z którą będziemy nadawali nazwy naszym dźwiękom. Konwencja ta, to po prostu ustalony sposób identyfikowania komponentów projektu za pomocą nazw. Stosowanie ustalonego nazewnictwa jest szczególnie istotne w przypadku, gdy pracujesz jako członek kilkuosobowego zespołu projektantów — wówczas każda osoba w zespole wie, jak powinien nazywać się każdy obrazek, dźwięk, symbol, klon, czy inny element filmu. Jednak nawet jeśli pracujesz samodzielnie, stosowanie konsekwentnego nazewnictwa ułatwi ci umieszczanie tych samych elementów w różnych projektach i identyfikowanie ich bez potrzeby każdorazowego zaglądania do starszych plików.

  1. Dla każdego klawisza pianina przygotujemy odrębny dźwięk. Każdy dźwięk będzie umieszczony na odrębnej listwie czasowej, co umożliwi sterowanie jego odtwarzaniem. Ponieważ nasza klawiatura pianina zawiera siedem klawiszy, zaimportujemy do Flasha siedem dźwięków. Wybierz polecenie File/Import i otwórz katalog ch18/pianoKeys/sounds/pc (lub ch18/pianoKeys/sounds/pc, jeśli pracujesz na Macintoshu) na naszym CD-ROM-ie. Zaimportuj do Flasha wszystkie siedem plików dźwiękowych.

(((odnośnik))) Zaimportowane dźwięki nie pojawią się na listwie czasowej — Flash umieści je bezpośrednio w bibliotece filmu. Jeśli chcesz przypomnieć sobie, jak importujemy dźwięki do Flasha, wróć do rozdziału 15., „Import i edycja dźwięku we Flashu”.

  1. Utwórz nowy symbol klipu filmowego, korzystając z polecenia Insert/New Symbol. Nadaj mu nazwę sound_1 (rysunek 18.6). Na listwie czasowej tego klipu umieścimy dźwięk key_1, który zaimportowałeś w poprzednim kroku.

0x01 graphic

Rysunek 18.6. Okno dialogowe Symbol Properties w trakcie tworzenia nowego symbolu klipu filmowego

  1. Flash automatycznie przejdzie do trybu edycji symbolu, umożliwiając edycję klipu filmowego sound_1. Zmień nazwę warstwy Layer 1 na labels (etykiety) i utwórz nową warstwę o nazwie sound. Na warstwie labels musimy oznaczyć trzy pozycje, odpowiadające trzem „stanom” dźwięku — brak dźwięku, początek dźwięku i dźwięk wyciszony. Dlaczego? Pamiętaj, że każdy klip filmowy uruchamia swoje odtwarzanie bezpośrednio po pojawieniu się na listwie czasowej. Musimy zatem być pewni, że pierwsze ujęcie klipu nie zawiera żadnego dźwięku, by uruchomić odtwarzanie dźwięku dopiero wtedy, gdy będzie to konieczne. Pierwszy stan — brak dźwięku — jest zatem reprezentowany przez pierwsze ujęcie kluczowe. Dla dwóch pozostałych stanów przygotuj ujęcia kluczowe z etykietami — w 3. klatce warstwy labels utwórz ujęcie kluczowe z etykietą start, zaś w 15. klatce utwórz ujęcie kluczowe z etykietą mute (rysunek 18.7). Pamiętaj, że etykiety możesz umieszczać tylko w ujęciach kluczowych. Jeśli spróbujesz opatrzyć etykietą ujęcie pośrednie, zostanie ona umieszczona w poprzedzającym je ujęciu kluczowym. Utwórz puste ujęcia (klawisz F5) w klatce numer 30., w warstwach labels i sound.

0x01 graphic

Rysunek 18.7. Dla wszystkich dźwięków zastosujemy taką samą strukturę, jak w klipie filmowym sound_1 — na początku puste ujęcie kluczowe, a następnie dwie etykiety, służące do rozpoczęcia i wyciszenia dźwięku

  1. Utwórz puste ujęcie kluczowe (klawisz F6) w trzecim ujęciu warstwy sound. Gdy nowe ujęcie kluczowe jest zaznaczone, utwórz panel Sound (polecenie Window/Panels/Sound). Z rozwijanej listy Sound wybierz dźwięk key_1.wav (lub key_1.aif). Pozostaw domyślne ustawienie parametru Sync na opcji Event (rysunek 18.8), aby Flash mógł nakładać na siebie kolejne klony tego dźwięku (czyli odtwarzać je równolegle).

0x01 graphic

Rysunek 18.8. W chwili przejścia do etykiety start na listwie czasowej sound_1, rozpocznie się odtwarzanie dźwięku key_1

  1. Powtórz krok 4. w 15. ujęciu warstwy sound. Tym razem jednak w panelu Sound ustaw parametr Sync (synchronizacja) na opcji Stop (rysunek 18.9). Gdy Flash osiągnie to ujęcie kluczowe, przerwie odtwarzanie wszystkich klonów dźwięku key_1.

0x01 graphic

Rysunek 18.8. W chwili osiągnięcia etykiety mute na listwie czasowej sound_1, Flash przerwie odtwarzanie wszystkich klonów dźwięku key_1. Gdy wybierzesz synchronizację Stop, na listwie czasowej pojawi się mały kwadrat (taki jak symbol klawisza Stop na magnetowidzie)

  1. Teraz umieścimy w listwie czasowej sound_1 kilka akcji stop(). Ponieważ za każdym razem, gdy użytkownik kliknie klawisz pianina, powinien odtworzyć się tylko odpowiadający mu dźwięk, musimy zapobiec odtwarzaniu innych, niepożądanych dźwięków. Utwórz nową warstwę, nadaj jej nazwę actions i umieść ją nad pozostałymi dwiema warstwami.. Kliknij dwukrotnie jej pierwsze ujęcie, aby utworzyć edytor skryptów. Rozwiń kategorię Basic Actions, kliknij w niej akcję Stop i przeciągnij ją do prawego okna edytora (rysunek 18.10).

0x01 graphic

Rysunek 18.10. Akcja stop() w pierwszym ujęciu zapobiega odtwarzaniu dźwięku w chwili pojawienia się klipu filmowego

  1. Gdy jest zaznaczone pierwsze ujęcie kluczowe warstwy actions, otwórz panel Frame w polu Label wpisz tekst //STOP. Każdy tekst rozpoczynający się dwoma ukośnikami // jest interpretowany jako komentarz i nie może służyć do adresowania ujęć, tak jak zwykłe etykiety. Komentarz //STOP w pierwszym ujęciu przypomina, że ujęcie to zawiera skrypt z akcją stop().

(((uwaga))) Podziękowania dla Shane'a Elliotta, jednego z redaktorów technicznych książki, za podzielenie się z nami swoją techniką korzystania z komentarzy //STOP

  1. Skopiuj ujęcie kluczowe STOP w pierwszej klatce, zaznaczając je i naciskając klawisze Ctrl+Alt+C (Option+Command+C). Możesz też kliknąć ujęcie kluczowe prawym klawiszem myszy (lub kliknąć z przytrzymanym klawiszem Ctrl na Macintoshu) i z podręcznego menu wybrać polecenie Copy Frames. Następnie zaznacz 10. ujęcie warstwy actions i naciśnij klawisze Ctrl+Alt+V (lub Option+Command+V), by wkleić skopiowane ujęcie kluczowe STOP. Podobnie wklej to ujęcie kluczowe w klatce numer 20. Rozmieszczenie ujęć STOP jest w pewnym stopniu dowolne — w ten sposób zapobiegamy odtwarzaniu ujęć opatrzonych etykietami w dalszej części listwy czasowej. Po zakończeniu wklejania listwa czasowa powinna przypominać tę z rysunku 18.11.

0x01 graphic

Rysunek 18.11. Akcje stop() w warstwie actions zapobiegają przechodzeniu wskaźnika czasu pomiędzy poszczególnymi obszarami listwy czasowej

  1. Następnie w klipie filmowym utworzymy ikonę, tak aby był on widoczny na obrazie. Utwórz nową warstwę i nadaj jej nazwę icon. W pierwszym ujęciu tej warstwy narysuj biały prostokąt. Następnie za pomocą narzędzia Text Tool umieść na prostokącie napis „Sound” (używając czarnego koloru wypełnienia). Zaznacz oba elementy i wyśrodkuj je na obrazie za pomocą panelu Align. Gdy oba elementy są zaznaczone, wybierz polecenie Insert/Convert to Symbol (klawisz F8). W oknie dialogowym Symbol Properties nadaj symbolowi zazwę soundIcon i wybierz typ symbolu Graphic (rysunek 18.12). Kliknij OK.

0x01 graphic

Rysunek 18.12. Ikona soundIcon stanowi wizualną reprezentację dźwiękowego klipu filmowego na obrazie

  1. Utwórz ujęcia kluczowe dla klonu symbolu soundIcon w klatkach 3., 10., 15. i 20. warstwy icon (rysunek 18.13).

0x01 graphic

Rysunek 18.13. Każdemu stanowi na listwie czasowej sound_1 odpowiada dedykowany klon ikony soundIcon

  1. Zaznacz klon symbolu soundIcon w ujęciu 3. i otwórz panel Effect. Z rozwijanej listy wybierz opcję Advanced i w prawej kolumnie parametrów wpisz wartość 255 w polu Green (rysunek 18.14).

0x01 graphic

Rysunek 18.14. Gdy listwa sound_1 osiągnie ujęcie start, ikona soundIcon zmieni kolor na zielony

  1. Powtórz krok 11. z symbolem soundIcon w ujęciu 15. Tym razem wpisz wartość 255 w prawej kolumnie parametrów w polu Red (rysunek 18.15). Ten krok kończy proces tworzenia pierwszego dźwiękowego klipu filmowego.

0x01 graphic

Rysunek 18.15. Gdy listwa sound_1 osiągnie ujęcie mute, ikona soundIcon zmieni kolor na czerwony

Teraz musimy powtórzyć ten sam proces dla dźwięków klawiszy od 2. do 7. (od key_2 do key_7). Nie musisz się jednak martwić ogromem pracy, ponieważ utworzyliśmy spójną strukturę w listwie czasowej sound_1, dlatego tworzenie pozostałych klipów filmowych będzie drobnostką.

  1. Otwórz bibliotekę filmu (klawisze Ctrl+L lub Command+L). Kliknij prawym klawiszem myszy (lub kliknij przytrzymując klawisz Ctrl na Macintoshu) symbol klipu filmowego sound_1 i z podręcznego menu wybierz polecenie Duplicate (rysunek 18.16).

0x01 graphic

Rysunek 18.16. Podręczne menu biblioteki zawiera kilka pożytecznych poleceń

  1. Nadaj nowemu klipowi filmowemu nazwę sound_2 i upewnij się, że jego typ (Behavior) jest ustawiony na opcji Movie Clip (klip filmowy). Kliknij OK.

  2. Kliknij dwukrotnie klip filmowy sound_2 w bibliotece, by przejść do edycji listwy czasowej tego klipu. Pamiętaj, że nie pracujemy już w listwą czasową klipu sound_1.

  3. Zaznacz 3. ujęcie warstwy sound i otwórz panel Sound (rysunek 18.17). Z rozwijanej listy Sound wybierz dźwięk key_2.wav (lub key_2.aif). Pozostałe parametry panelu Sound pozostaw niezmienione.

0x01 graphic

Rysunek 18.17. W kroku 16. zmieniamy dźwięk, który będzie odtwarzany na listwie czasowej sound_2

  1. Powtórz czynności z kroku 16. w 15. ujęciu warstwy Sound (rysunek 18.18).

0x01 graphic

Rysunek 18.18. W kroku 17. zmieniamy dźwięk, którego odtwarzanie zostanie przerwane na listwie czasowej sound_2

To wszystkie czynności, potrzebne do prawidłowego działania klipu sound_2! Teraz możesz z łatwością utworzyć pozostałe dźwiękowe klipy filmowe (sound_3 do sound_7), powtarzając kroki od 13. do 17. i zmieniając w nich numery klipu i dźwięku. Gdy ukończysz tworzenie wszystkich dźwiękowych klipów filmowych, będziesz gotowy do tworzenia klipu filmowego z biblioteką dźwięków.

(((cd-rom))) Porównaj rezultat swoich działań z filmem ch18/pianoKeys/pianoKeys_starter_sounds.fla na naszym CD-ROM-ie. Film ten zawiera w bibliotece siedem dźwiękowych klipów filmowych, umieszczonych w folderze keySounds.

Tworzenie klipu filmowego z biblioteką dźwięków

Nasz film zawiera siedem gotowych do działania dźwiękowych klipów filmowych, jednak musimy je umieścić gdzieś na obrazie. Najłatwiejszym rozwiązaniem byłoby umieszczenie ich na obrazie głównego filmu, lecz wówczas na obrazie filmu szybko zrobiłoby się tłoczno, gdyby na jego obszarze znalazło się więcej symboli. Dlatego wszystkie dźwiękowe klipy filmowe włożymy do jednego „pudełka”, którym również będzie klip filmowy. Klip ten będziemy nazywać biblioteką dźwięków i nadamy mu nazwę soundLib.

  1. Utwórz nowy symbol za pomocą polecenia Insert/New Symbol (klawisze Ctrl+F8 lub Command+F8). Nadaj mu nazwę soundLib i wybierz typ symbolu Movie Clip. Kliknij OK. Flash przejdzie do edycji listwy czasowej nowego klipu.

  2. Zmień nazwę pierwszej warstwy na sound_1 i przeciągnij klon klipu filmowego sound_1 z biblioteki na obraz klipu soundLib. Otwórz panel Instance i nadaj nowemu klonowi nazwę sound_1 (rysunek 18.19).

0x01 graphic

Rysunek 18.19. Klon klipu sound_1 na listwie czasowej soundLib

(((uwaga))) Dla ułatwienia możesz nadać klonowi (i zajmowanej przez niego warstwie) taką samą nazwę, jaką posiada macierzysty symbol w bibliotece. Jeśli na tej samej listwie czasowej nie będziesz umieszczał kilku klonów tego symbolu, nie doprowadzi to do dwuznaczności. Ułatwia to kojarzenie klonów z ich symbolami w bibliotece.

  1. Utwórz w klipie soundLib jeszcze sześć warstw i nadaj im kolejno nazwy sound_2 do sound_7. Na każdej z tych warstw umieść klon odpowiadającego jej symbolu. Nadaj każdemu klonowi taką samą nazwę jak nazwa jego symbolu w bibliotece — podobnie jak zrobiłeś w kroku 2. Rozmieść poszczególne klony na obrazie w kolumnie, umieszczając klon sound_1 na najwyższej pozycji (rysunek 18.20). Za pomocą panelu Align wyśrodkuj klony w poziomie (ikona Align horizontal center) i rozmieść je równomiernie w pionie (ikona Space evenly vertically).

0x01 graphic

Rysunek 18.20. Listwa czasowa soundLib zawiera klony wszystkich siedmiu dźwiękowych klipów filmowych

  1. Wróć do edycji głównego filmu (Scene 1). Utwórz nową warstwę o nazwie soundLib. Umieść w jej pierwszym ujęciu klon klipu filmowego soundLib. Nadaj klonowi nazwę soundLib w panelu Instance (rysunek 18.21). Prawdopodobnie konieczna będzie również zmiana wymiarów klonu, by zmieścił się on na obrazie.

0x01 graphic

Rysunek 18.21. Z dźwiękowymi klipami filmowymi będziemy się komunikować za pośrednictwem listwy czasowej klonu soundLib, umieszczonego na głównej listwie czasowej

Nasza biblioteka dźwięków jest gotowa. Teraz pozostaje utworzyć skrypty w klipie filmowym pianoKeys, które będą sterowały odtwarzaniem odpowiednich dźwięków w utworzonej bibliotece dźwięków.

(((cd-rom))) Film na tym etapie produkcji możesz porównać z plikiem ch18/pianoKeys/pianoKeys_starter_soundLib.fla na naszym CD-ROM-ie.

Adresowanie dźwiękowych klipów filmowych z użyciem notacji kropkowej

Film zawiera teraz klon klipu filmowego soundLib oraz klon klipu filmowego pianoKeys — obydwa umieszczone na poziomie głównej listwy czasowej. Teraz pokażemy, jak jeden z tych klipów może sterować elementami drugiego klipu. Nie użyjemy do tego celu akcji tellTarget, lecz zastosujemy metody obiektu Movie Clip, dostępne w języku ActionScript. Jeśli nie pamiętasz co to są metody obiektów, wróć do ramki „Nowy lepszy ActionScript” we wcześniejszej części rozdziału. Pozostałą część ćwiczenia poświęcimy na tworzenie skryptów Flasha 5 w ujęciach listwy czasowej klipu pianoKeys, które będą się odnosiły do klipów dźwiękowych w bibliotece dźwięków.

(((uwaga))) Listwa czasowa klipu pianoKeys będzie zawierała więcej niż jedną warstwę przeznaczoną na skrypty (warstwę actions). Warstwa actions tworzona w kroku 1. jest nową warstwą, tworzoną oprócz istniejącej warstwy actions (tej zawierającej komentarze //STOP).

  1. Przejdź do trybu edycji symboli, klikając dwukrotnie klon pianoKeys w głównym filmie. Na listwie czasowej pianoKeys utwórz nową warstwę i nadaj jej nazwę actions. Umieść ją pod warstwą labels, zawierającą etykietę key_1 (rysunek 18.22).

0x01 graphic

Rysunek 18.22. Nie obawiaj się tworzenia oddzielnych warstw dla takich elementów jak akcje czy etykiety. Ułatwi ci to dostęp do tych elementów

  1. W trzecim ujęciu nowej warstwy actions umieścimy skrypt, który będzie odtwarzał pierwszy dźwięk z naszej biblioteki dźwięków (soundLib). Pamiętaj, że klony przycisków na listwie czasowej pianoKeys zawierają już skrypty wykonujące przejścia do odpowiednich etykiet. Utwórz puste ujęcie kluczowe (klawisz F7) w klatce numer 3 warstwy actions.

  2. Kliknij dwukrotnie nowe ujęcie kluczowe, aby otworzyć edytor skryptów. Rozwiń menu edytora (kliknij ikonę strzałki w prawym górnym narożniku) i wybierz tryb Expert Mode (możesz też użyć klawiszy Ctrl+E lub Command+E). Kliknij w oknie skryptu (prawym oknie edytora) i wpisz poniższą linię:

_root.soundLib.sound_1.gotoAndPlay("start");

Rysunek 18.23 przedstawia edytor skryptu po wpisaniu tej linii. Kod ten odnosi się do głównej listwy czasowej (_root), w której kieruje się do klonu klipu filmowego o nazwie soundLib; w nim z kolei zwraca się do listwy czasowej klonu sound_1; wreszcie w tej listwie czasowej wykonuje akcję gotoAndPlay, która przechodzi do ujęcia o etykiecie start i rozpoczyna odtwarzanie (przerwane przez akcję zawartą w pieszym ujęciu tego klonu).

0x01 graphic

Rysunek 18.23. Ta pojedyncza linia skryptu realizuje zadanie, które w przypadku zastosowania akcji tellTarget wymagałoby aż trzech linii (tellTarget ("/soundLib/sound_1"){gotoAndPlay("start");})

(((uwaga))) Aby ten sam dźwięk można było odtwarzać wielokrotnie, użyliśmy akcji gotoAndPlay() zamiast gotoAndStop(). Gdy akcja gotoAndStop przechodzi do określonego ujęcia kluczowego i zatrzymuje w nim odtwarzanie, następne akcje przechodzące do tego ujęcia nie działają. Dlaczego? Ponieważ wskaźnik czasu znajduje się już w tym ujęciu, więc przejście nie jest konieczne. Gdy korzystamy z akcji gotoAndPlay(), wskaźnik czasu listwy sound_1 przechodzi do ujęcia kluczowego o określonej etykiecie, a następnie kontynuuje odtwarzanie następnych ujęć, aż do osiągnięcia akcji stop w jednym z nich.

  1. Gdy jest zaznaczone 3. ujęcie warstwy actions (znajdujące się bezpośrednio pod etykietą key_1), otwórz panel Frame. W polu Label wpisz komentarz //graj dźwięk (rysunek 18.24).

0x01 graphic

Rysunek 18.24. Komentarz //graj dźwięk przypomina, co robi skrypt zawarty w danym ujęciu

W tym miejscu powinieneś przetestować film, by sprawdzić, że akcja jest odpowiednio zaadresowana i czy uruchamia odtwarzanie odpowiedniego dźwięku. Zapisz film i wybierz polecenie Control/Test Movie, by utworzyć plik .SWF. Sprawdź czy działa akcja w ujęciu kluczowym i czy słyszysz dźwięk po naciśnięciu pierwszego klawisza pianina. Zwróć uwagę, że zmieni się również kolor ikony soundIcon, odpowiadającej odtwarzanemu dźwiękowi (powinien się zmienić na zielony).

  1. Teraz w podobny sposób utworzymy skrypty odtwarzające pozostałe dźwięki z biblioteki soundLib. Utwórz nową warstwę actions. Umieść ją pod warstwą labels zawierającą etykietę key_2. Skopiuj ujęcie kluczowe //graj dźwięk z poprzedniej warstwy actions (użyj klawiszy Ctrl+Alt+C lub Option+Command+C). Następnie wklej skopiowane ujęcie kluczowe w klatce numer 5 nowej warstwy actions (użyj klawiszy Ctrl+Alt+V lub Option+Command+V).

  2. Kliknij dwukrotnie nowe ujęcie kluczowe //graj dźwięk (znajdujące się bezpośrednio pod etykietą key_2). W edytorze skryptów zmień ścieżkę adresową akcji (rysunek 18.25):

_root.soundLib.sound_2.gotoAndPlay("start");

0x01 graphic

Rysunek 18.25. Ta listwa czasowa zawiera dwa skrypty odtwarzające dźwięki klawiszy

  1. Powtórz kroki 5. i 6. dla pozostałych klawiszy pianina (key_3 do key_7) i dźwięków (sound_3 do sound_7). Każdy skrypt klawisza powinien się znaleźć na oddzielnej warstwie actions, dokładnie pod etykietą key_<numer_klawisza>, w ujęciu kluczowym oznaczonym komentarzem //graj dźwięk. Po zakończeniu tworzenia skryptów listwa czasowa powinna przypominać tę z rysunku 18.26. Testuj film po utworzeniu każdego skryptu. Jeśli określony klawisz pianina nie działa, sprawdź dwa elementy — ścieżkę adresową w skrypcie oraz nazwę klonu klipu dźwiękowego w bibliotece soundLib. Większość błędów w filmach wynika z brakujących nazw klonów klipów filmowych.

0x01 graphic

Rysunek 18.26. Gotowa listwa czasowa klipu filmowego pianoKeys

Gdy ukończysz tworzenie wszystkich skryptów, zapisz film i przetestuj go. Rezultatem tego ćwiczenia jest funkcjonalne pianino Flasha, które po kliknięciu wybranego klawisza za pomocą myszy odtwarza odpowiadający mu dźwięk. Jeśli chcesz przypisać poszczególnym klawiszom pianina inne dźwięki, możesz wstawić w bibliotece nowe dźwięki w miejsce dotychczasowych, korzystając z przycisku Import. Możesz też po prostu zaimportować nowe dźwięki i umieścić je w odpowiednich klipach filmowych sound_<numer_klawisza>.

Jak klipy filmowe mogą wpływać na działanie filmu

Niezbyt oczywisty, choć istotny jest fakt, że klipy filmowe nie muszą zawierać żadnych elementów graficznych. Mogą one być używane jako elementy wpływające na działanie filmu, sterujące zachowaniem określonych obiektów. Klip filmowy może być ciągiem pustych ujęć (pustych pod względem grafiki), zawierających jedynie etykiety i skrypty. Skrypty innych listew czasowych mogą sterować odtwarzaniem takich pustych klipów filmowych, co może posłużyć do wprowadzenia w filmie logicznych działań i elementów pamięci. Takie „puste” klipy filmowe postanowiliśmy nazwać logicznymi klipami filmowymi. Przykładem interaktywnego elementu utworzonego z użyciem logicznego klipu filmowego może być licznik punktacji w prostej grze.

Przypuśćmy, że pracujesz nad filmem zawierającym trzy pytania typu „prawda lub fałsz” z odpowiedziami udzielanymi za pomocą przycisków Prawda i Fałsz. Użytkownik odpowiada na pytanie przez kliknięcie przycisku z odpowiedzią. Ponadto film zawiera klip filmowy z czterema ujęciami kluczowymi. Pierwsze ujęcie kluczowe mieści skrypt z akcją stop. Ostatnie ujęcie kluczowe zawiera z skrypt (z akcją tellTarget), który zleca głównej listwie czasowej przejście do ujęcia kluczowego z gratulacjami. Wreszcie każdy przycisk z poprawną odpowiedzią zawiera skrypt (również z akcją tellTarget), który zleca logicznemu klipowi filmowemu przejście do następnego ujęcia. Oto scenariusz, w którym użytkownik udziela wszystkich poprawnych odpowiedzi — na pierwsze pytanie użytkownik odpowiada klikając przycisk z poprawną odpowiedzią, więc logiczny klip filmowy przechodzi do drugiego ujęcia; na drugie pytanie użytkownik odpowiada klikając przycisk z poprawną odpowiedzią, więc logiczny klip filmowy przechodzi do trzeciego ujęcia; podobnie z trzecim i czwartym pytaniem. W czwartym ujęciu logicznego klipu filmowego skrypt zleca głównej listwie czasowej przejście do ujęcia z gratulacjami, zatem na obrazie pojawia się komunikat „Gratulacje, na wszystkie pytania odpowiedziałeś poprawnie!”. Co się stanie, gdy jedna z odpowiedzi użytkownika będzie błędna? Wówczas logiczny klip filmowy przy tej odpowiedzi nie przejdzie do następnego ujęcia i w rezultacie na końcu gry nie osiągnie czwartego ujęcia — skrypt zawarty w tym ujęciu nie zostanie wykonany i główna listwa czasowa nie przejdzie do ujęcia z gratulacjami.

Tego typu sztuczki były często stosowane we Flashu 3. Korzystając z logicznych klipów filmowych, pomysłowi projektanci uzyskiwali imponujące rezultaty — we Flashu 3 utworzono nawet prostą wersję gry Pac Man (grę możesz zobaczyć pod adresem --> www.spookyandthebandit.com[Author:MB] ; tam możesz też pobrać darmowy plik .FLA). Jednak teraz, gdy Flash 5 umożliwia korzystanie ze zmiennych i sterowanie właściwościami klipów filmowych za pomocą skryptów, niektóre z tych zastosowań po prostu nie są potrzebne. Niemniej jednak warto pamiętać, że klipy filmowe mogą służyć nie tylko jako elementy przechowujące krótkie animacje, lecz również jako narzędzia do tworzenia zaawansowanych rozwiązań programistycznych.

Podsumowanie

2 Część I Podstawy obsługi systemu WhizBang (Nagłówek strony)

2 E:\MOJEDO~1\!TŁUMA~1\!23~1.FLA\MAREKB~1\r18-t.doc

DO KOREKTY MERYTORYCZNEJ> Zmieniłem przykład — ten z poduszką, który jest w oryginale, jakoś nie trzyma się tematu

DO składu> Ten rysunek przesuwa się w górę względem oryginału

DO składu> Ten rysunek przesuwa się w górę względem oryginału

Sprawdzałem ten adres i nie udało mi się odnaleźć strony o takim adresie. Pamiętam jednak, że widziałem już ten adres w jakiejś książce o Flashu (jest też Księdze eksperta Flasha 4). Ponadto wyszukiwarka www.altavista.com też znalazła stronę o takim adresie (lecz również nie potrafiła jej otworzyć). Być może serwer jest czasowo wyłączony? W każdym razie zostawiam ten adres.



Wyszukiwarka

Podobne podstrony:
Ściskanie sprawko 05 12 2014
05 12 2011
finansowość zarządcza 05 05 12
1386217 05 12 19raportanalitycznysokow sopkołow
Ortografia 8 05 12
05,12,14
05,12,21
Socjologia -05.12.08Odrodzeniowa myśl społeczna - Ciąg dalszy, Socjologia 8-12-05
Wykład 12 (05.12.07), toxycologia
BPZ, 05 12 (2)
Egzamin biochemia1 05 12 odpowiedzi
05, 05, 12-10-2009
Higiena mleka, Wykład (5) 05-12-2013, Wykład (4) 05-12-2013
finansowość zarządcza 05.05.12
DGP 2014 05 12 rachunkowosc i audyt
Prawo rodzinne, prawo rodzinne i opiekuncze 05.12.2008
DKE (9) 05.12.2007

więcej podobnych podstron