Praca z obiektami

ActionScript należy do języków programowania zorientowanych obiektowo. Programowanie zorientowane obiektowo to po prostu podejście do programowania. W ten sposób określana jest metoda porządkowania kodu w programie przy wykorzystaniu obiektów.

Wcześniej termin „program” został zdefiniowany jako seria kroków lub instrukcji, które wykonuje komputer. A zatem możemy wyobrażać sobie program jako jedną długą listę instrukcji. Jednak w programowaniu zorientowanym obiektowo instrukcje programu są podzielone między różne obiekty. Kod jest podzielony na fragmenty wg funkcji, dlatego powiązane typy funkcji lub powiązane fragmenty informacji są zgrupowane w jednym kontenerze.

Adobe Flash Professional

Każdy kto pracował z symbolami w programie Flash Professional, miał już okazję do pracy z obiektami. Wyobraźmy sobie, że zdefiniowaliśmy symbol klipu filmowego — np. rysunek prostokąta — i umieściliśmy egzemplarz tego symbolu na stole montażowym. Ten symbol klipu filmowego jest także (literalnie) obiektem w języku ActionScript; stanowi instancję klasy MovieClip.

Klip filmowy ma szereg cech, które możemy modyfikować. Po wybraniu klipu w Inspektorze właściwości można zmienić wartości, takie jak współrzędna x lub szerokość. Możliwe jest również dopasowywanie kolorów np. poprzez zmianę współczynnika alfa (przezroczystość) lub zastosowanie filtra cieniowania. Inne narzędzia programu Flash Professional pozwalają na wprowadzanie dalszych zmian, np. narzędzie Transformacja swobodna pozwala na obrócenie prostokąta. Wszystkie metody modyfikowania klipu filmowego w programie Flash Professional są również dostępne w języku ActionScript. Modyfikowanie klipu filmowego w języku ActionScript polega na zmianie elementów informacji, które są umieszczane w pojedynczym pakunku nazywanym obiektem MovieClip.

W obiektowo zorientowanym języku ActionScript każda klasa może mieć trzy rodzaje cech:

  • właściwości;

  • metody;

  • zdarzenia.

Te elementy służą do zarządzania elementami danych używanymi w programie i do podejmowania decyzji o wykonywanych czynnościach oraz kolejności czynności.

Właściwości

Właściwość reprezentuje jeden z elementów danych, które powiązane ze sobą składają się na obiekt. Przykład obiektu utworu muzycznego może mieć właściwości o nazwie artist i title ; klasa MovieClip ma takie właściwości, jak rotation , x , width i alpha . Właściwości należy traktować jako pojedyncze zmienne. W rzeczywistości właściwości można traktować jako zmienne „podrzędne” zawarte w obiekcie.

Oto przykłady kodu w języku ActionScript, w których używane są właściwości. Ten wiersz kodu przenosi obiekt MovieClip o nazwie square do położenia o współrzędnej x=100 pikseli:

square.x = 100;

W tym przykładzie użyto właściwości rotation w celu obrócenia obiektu MovieClip o nazwie square o taki kąt, by był obrócony tak samo, jak obiekt MovieClip o nazwie triangle :

square.rotation = triangle.rotation;

Ten przykład modyfikuje skalę poziomą obiektu MovieClip square , tak aby był o półtora raza szerszy niż dotychczas:

square.scaleX = 1.5;

Należy zwrócić uwagę na wspólną strukturę: używamy zmiennej ( square , triangle ) jako nazwy obiektu, po niej stawiamy kropkę ( . ), a następnie podajemy nazwę właściwości ( x , rotation , scaleX ). Kropka, formalnie nazywana operatorem kropki , oznacza odwołanie do jednego z elementów podrzędnych zawartych w obiekcie. Cała struktura „nazwa zmiennej-kropka-nazwa właściwości” może być używana tak, jak pojedyncza zmienna, czyli nazwa pojedynczej wartości w pamięci komputera.

Metody

Metoda jest działaniem, które może wykonać obiekt. Na przykład: załóżmy, że, w programie Flash Professional utworzony został symbol klipu filmowego z kilkoma klatkami i klatkami kluczowymi na osi czasu. Ten klip filmowy może zostać odtworzony lub zatrzymany, a także możliwe jest przesunięcie głowicy odtwarzania do wybranej klatki.

Ten kod nakazuje obiektowi MovieClip o nazwie shortFilm rozpoczęcie odtwarzania:

shortFilm.play();

Ten wiersz zatrzymuje odtwarzanie obiektu MovieClip o nazwie shortFilm (głowica odtwarzania zatrzymuje się w bieżącym położeniu, tak jak przy wstrzymaniu odtwarzania):

shortFilm.stop();

Ten kod powoduje, że głowica odtwarzania obiektu MovieClip o nazwie shortFilm jest przenoszona do klatki 1, a odtwarzanie jest zatrzymywane (tak jak przy przewinięciu materiału wideo):

shortFilm.gotoAndStop(1);

Dostęp do metod, podobnie jak do właściwości, uzyskuje się poprzez podanie nazwy obiektu (zmiennej), kropki i nazwy metody, po której następują nawiasy. Nawiasy oznaczają, że wywołujemy metodę — czyli że nakazujemy obiektowi wykonanie danej operacji. Niekiedy w nawiasach umieszcza się wartości (lub zmienne), aby w ten sposób przekazać dodatkowe informacje potrzebne do wykonania operacji. Wartości te nazywane są parametrami metody. Na przykład metoda gotoAndStop() potrzebuje informacji o tym, do której klatki ma przejść, a zatem w nawiasach należy przekazać jej jeden parametr. Inne metody, jak play() i stop() , odzwierciedlają oczywiste operacje i nie wymagają żadnych dodatkowych informacji. Mimo to w ich zapisie także należy używać nawiasów.

W przeciwieństwie do właściwości (i zmiennych) metody zastępują wartości. Jednak niektóre metody mogą wykonywać obliczenia i zwracać wynik, którego następnie można używać tak, jak zmiennej. Na przykład metoda toString() klasy Number konwertuje wartość liczbową na jej reprezentację tekstową:

var numericData:Number = 9; 
var textData:String = numericData.toString();

Metody toString() użylibyśmy na przykład po to, aby wyświetlić wartość zmiennej Number w polu tekstowym na ekranie. Właściwość text klasy TextField jest zdefiniowana jako String, a więc może zawierać tylko wartości tekstowe. (Właściwość text reprezentuje rzeczywistą treść tekstu wyświetlanego na ekranie). Ten wiersz kodu powoduje przekształcenie wartość liczbowej w zmiennej numericData na tekst. Następnie wartość jest wyświetlana na ekranie w obiekcie TextField i nazwie calculatorDisplay :

calculatorDisplay.text = numericData.toString();

Zdarzenia

Program komputerowy jest szeregiem instrukcji wykonywanych krok po kroku przez komputer. Niektóre proste programy komputerowe faktycznie sprowadzają się do kilku kroków, po wykonaniu których program kończy działanie. Jednak programy w języku ActionScript mogą także oczekiwać na wprowadzenie danych przez użytkownika oraz na inne zdarzenia. Zdarzenia to mechanizm decydujący o tym, które instrukcje komputer wykonuje i kiedy je wykonuje.

Co do zasady zdarzenia są sytuacjami, które środowisko ActionScript rozpoznaje i na które potrafi zareagować. Wiele zdarzeń jest związanych z interakcją z użytkownikiem, na przykład: z kliknięciem przycisku lub naciśnięciem klawisza na klawiaturze. Istnieją również inne typy zdarzeń. Na przykład, jeśli w programie ActionScript ładujemy zewnętrzny obraz, zachodzi zdarzenie informujące o zakończeniu ładowania. Zgodnie z koncepcją: podczas działania program ActionScript oczekuje na zdarzenia. Gdy wystąpią zdarzenia, wówczas zostanie wykonany konkretny kod ActionScript określonych dla tych zdarzeń.

Podstawy obsługi zdarzeń

Technika określania operacji, które powinny być wykonywane w odpowiedzi na określone zdarzenia, nazywana jest obsługą zdarzeń . Pisząc w języku ActionScript kod obsługujący zdarzenia, musimy brać pod uwagę trzy ważne elementy:

  • Źródło zdarzenia: w którym obiekcie zachodzi zdarzenie? Na przykład, który przycisk został kliknięty lub który obiekt Loader ładuje obraz? Źródło zdarzenia jest również określane jako cel zdarzenia . Taka nazwa jest spowodowana tym, że jest to obiekt, do którego komputer kieruje zdarzenie (miejsce, w którym w rzeczywistości dojdzie do zdarzenia).

  • Zdarzenie: co takiego ma się stać i na co będziemy reagować? Identyfikacja zdarzenia jest ważna, ponieważ wiele obiektów może wywoływać kilka zdarzeń.

  • Reakcja: jakie operacje chcemy wykonać, gdy zajdzie zdarzenie?

Każdy kod ActionScript przeznaczony do obsługi zdarzeń wymaga następujących elementów. Kod jest zgodny z następującą podstawową strukturą (elementy pogrubione są elementami zastępczymi, które zostaną wprowadzone w konkretnym przypadku):

function eventResponse(eventObject:EventType):void 
{ 
    // Actions performed in response to the event go here. 
} 
  
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

Ten kod ma dwie funkcje. Po pierwsze definiuje funkcję, określając w ten sposób operacje, które mają być wykonane w reakcji na zdarzenie. Następnie wywołuje metodę addEventListener() obiektu źródłowego. Wywołanie metody addEventListener() powoduje „subskrypcję” funkcji dla określonego zdarzenia. Gdy wystąpi zdarzenie, zostaną wykonane operacje funkcji. Teraz przyjrzymy się bliżej każdej z tych części kodu.

Funkcja to sposób zgrupowania operacji pod jedną nazwą, pozwalającą na skrótowe wywołanie tych operacji. Funkcja jest identyczna z metodą, ale nie musi być skojarzona z konkretną klasą. (Termin „metoda” może zostać zdefiniowany jako funkcja, która jest powiązana z określoną klasą). Tworząc funkcję do obsługi zdarzeń, należy wybrać nazwę funkcji (w tym przypadku jest to nazwa eventResponse ). Należy także określić jeden parametr (w tym przykładzie jest to parametr eventObject ). Określenie parametru funkcji przypomina deklarowanie zmiennej, a zatem również wymaga podania typu danych parametru. (W omawianym przykładzie typem parametru jest EventType ).

Z każdym typem zdarzeń, które mogą być wykrywane, jest w środowisku ActionScript skojarzona odpowiednia klasa. Typ danych określony dla parametru funkcji jest zawsze klasą skojarzoną z typem zdarzeń, na które chcemy reagować. Na przykład zdarzenie click (wywoływane, gdy użytkownik kliknie myszą na elemencie) jest skojarzone z klasą MouseEvent. Aby napisać funkcję wykrywającą zdarzenie click (tzw. detektor tego zdarzenia), musimy zdefiniować funkcję wykrywającą z parametrem typu MouseEvent. Na koniec, między otwierającym a zamykającym nawiasem sześciennym ( { ... } ), wpisujemy instrukcje, które komputer ma wykonać po zajściu zdarzenia.

W ten sposób została napisana funkcja obsługi zdarzeń Następnie wymagana jest instrukcja dla obiektu zdarzenia źródłowego (jest to obiekt, dla którego wystąpiło zdarzenie, na przykład: przycisk), która spowoduje, że obiekt wywoła funkcję po zajściu zdarzenia. Funkcję należy zarejestrować w obiekcie zdarzenia źródłowego poprzez wywołanie metody addEventListener() tego obiektu (wszystkie obiekty zawierające zdarzenia zawierają również metodę addEventListener() ). Metoda addEventListener() ma dwa parametry:

  • Pierwszym parametrem jest nazwa zdarzenia, na które chcemy reagować. Każdy obiekt jest łączony z określoną klasą. Każda klasa zdarzenia zawiera specjalną wartość, która pełni rolę unikalnej nazwy zdefiniowanej dla każdego obiektu. Ta wartość jest używana dla pierwszego parametru.

  • Drugim parametrem jest nazwa funkcji reagującej na zdarzenie. Należy zwrócić uwagę, że nazwa funkcji przekazywana jako parametr jest zapisana bez nawiasów.

Proces obsługi zdarzeń

Poniżej krok po kroku opisano proces zachodzący podczas tworzenia detektora zdarzeń. W omawianym przykładzie tworzymy funkcję wykrywającą (detektor) wywoływaną w odpowiedzi na kliknięcie obiektu myButton .

Prawdziwy kod napisany przez programistę wygląda następująco:

function eventResponse(event:MouseEvent):void 
{ 
    // Actions performed in response to the event go here. 
} 
 
myButton.addEventListener(MouseEvent.CLICK, eventResponse);

A tak działałby ten kod:

  1. Po załadowaniu pliku SWF komputer odnotowuje fakt, że zawiera on funkcję o nazwie eventResponse() .

  2. Następnie komputer uruchamia kod (przede wszystkim wiersze kodu, które nie należą do żadnej funkcji). W tym przypadku jest to tylko jeden wiersz kodu: wywołanie metody addEventListener() w obiekcie źródłowym (o nazwie myButton ) i przekazanie funkcji eventResponse jako parametru.

    Obiekt myButton zawiera listę funkcji-detektorów, które wykrywają poszczególne zdarzenia. Po wywołaniu metody addEventListener() obiekt myButton będzie zawierał funkcję eventResponse() na liście detektorów.

  3. W pewnej chwili użytkownik klika przycisk myButton , wywołując jego zdarzenie click (w kodzie oznaczone MouseEvent.CLICK ).

    W tym momencie zachodzą następujące procesy:

    1. Następuje utworzenie obiektu będącego instancją klasy skojarzonej ze zdarzeniem (w tym przykładzie MouseEvent). W przypadku wielu zdarzeń ten obiekt jest instancją klasy Event: W przypadku zdarzeń myszy jest to instancja klasy MouseEvent. W przypadku innych zdarzeń jest to instancja klasy skojarzonej z konkretnym zdarzeniem. Utworzony obiekt nazywany jest obiektem zdarzenia i zawiera konkretne informacje o zdarzeniu, które miało miejsce: jakiego typu jest to zdarzenie, gdzie zaszło, a także inne informacje charakterystyczne dla zdarzenia.

    2. Następnie komputer przeszukuje listę detektorów zdarzeń zapisaną w obiekcie myButton . Kolejno wywołuje funkcje wymienione na liście i przekazuje do każdej z nich obiekt zdarzenia jako parametr. Ponieważ funkcja eventResponse() jest jednym z detektorów zdarzeń obiektu myButton , w ramach tego procesu komputer wywołuje funkcję eventResponse() .

    3. Po wywołaniu funkcji eventResponse() zawarty w niej kod realizuje określone operacje.

Przykłady obsługi zdarzeń

Poniżej przedstawiono kilka przykładów kodu przeznaczonego do obsługi zdarzeń. Te przykłady przedstawiają niektóre z najczęściej stosowanych elementów zdarzeń oraz możliwych zmian, jakie można wprowadzić podczas pisania kodu obsługi zdarzeń.

  • Kliknięcie przycisku w celu rozpoczęcia odtwarzania klipu filmowego. W poniższym przykładzie playButton to nazwa instancji przycisku, a this to specjalna nazwa oznaczająca „bieżący obiekt”:

    this.stop(); 
     
    function playMovie(event:MouseEvent):void 
    { 
        this.play(); 
    } 
     
    playButton.addEventListener(MouseEvent.CLICK, playMovie);
  • Wykrywanie wpisywania w polu tekstowym. W tym przykładzie entryText to wejściowe pole tekstowa, e outputText to dynamiczne pole tekstowe:

    function updateOutput(event:TextEvent):void 
    { 
        var pressedKey:String = event.text; 
        outputText.text = "You typed: " + pressedKey; 
    } 
     
    entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);
  • Przejście do adresu URL po kliknięciu przycisku. W tym przypadku linkButton to nazwa instancji przycisku:

    function gotoAdobeSite(event:MouseEvent):void 
    { 
        var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); 
        navigateToURL(adobeURL); 
    } 
     
    linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

Tworzenie instancji obiektów

Aby w języku ActionScript można było użyć obiektu, obiekt ten musi istnieć. Jednym z etapów tworzenia obiektu jest zadeklarowanie zmiennej; jednak deklaracja zmiennej rezerwuje jedynie puste miejsce w pamięci komputera. Zawsze należy przypisać zmiennej konkretną wartość (tzn. utworzyć obiekt i zapisać go w zmiennej) zanim spróbujemy użyć obiektu lub nim manipulować. Proces tworzenia obiektów jest określony jako tworzenie instancji klasy. Innymi słowy: należy utworzyć instancję konkretnej klasy.

Najprostszy sposób utworzenia instancji obiektu w ogóle nie wymaga programowania w języku ActionScript. W programie Flash Professional umieść symbol klipu filmowego, symbol przycisku lub pole tekstowe na stole montażowym i przypisz mu nazwę instancji. Program Flash Professional automatycznie zadeklaruje zmienną o nazwie instancji, utworzy instancję i umieści obiekt w tej zmiennej. Podobnie w programie Flex — składnik tworzony jest w kodzie MXML poprzez zdefiniowanie znacznika MXML lub umieszczenie składnika w edytorze w trybie projektowania programu Flash Builder. Po przypisaniu identyfikatora do składnika ten identyfikator staje się nazwą zmiennej ActionScript zawierającej instancję tego składnika.

Jednak nie zawsze konieczne jest tworzenie obiektu w trybie ekranowym, a w przypadku obiektów niewidocznych nie jest to możliwe. Istnieje również kilka dodatkowych sposobów tworzenia obiektów w kodzie ActionScript.

Niektóre typy danych języka ActionScript pozwalają na tworzenie instancji poprzez wpisanie wyrażenia literalnego — tj. wartości wpisanej wprost w kodzie ActionScript. Oto kilka przykładów:

  • Literalna wartość liczbowa (liczby wprowadza się bezpośrednio):

    var someNumber:Number = 17.239; 
    var someNegativeInteger:int = -53; 
    var someUint:uint = 22;
  • Literalny ciąg znaków (tekst należy ująć w cudzysłów):

    var firstName:String = "George"; 
    var soliloquy:String = "To be or not to be, that is the question...";
  • Literalna wartość logiczna (należy wpisać literał true albo false ):

    var niceWeather:Boolean = true; 
    var playingOutside:Boolean = false;
  • Literalna wartość tablicy (listę wartości oddzielanych przecinkami należy ująć w nawiasy kwadratowe):

    var seasons:Array = ["spring", "summer", "autumn", "winter"];
  • Literalna wartość XML (kod XML należy wpisać bezpośrednio):

    var employee:XML = <employee> 
            <firstName>Harold</firstName> 
            <lastName>Webster</lastName> 
        </employee>;

W języku ActionScript dozwolone są także wyrażenia literalne typu Array, RegExp, Object i Function.

Najczęściej stosowanym sposobem tworzenia instancji dla dowolnego typu danych jest użycie operatora new z nazwą klasy, co przedstawiono poniżej:

var raceCar:MovieClip = new MovieClip(); 
var birthday:Date = new Date(2006, 7, 9);

Tworzenie obiektu przy użyciu operatora new jest często nazywane „wywołaniem konstruktora klasy”. Konstruktor to specjalna metoda wywoływana w procesie tworzenia instancji klasy. W przypadku tworzenia instancji w ten sposób nawiasy należy umieścić za nazwą klasy. Czasami wartości parametrów również określa się w nawiasach. Istnieją dwie czynności, jakie należy wykonać w przypadku wywoływania metody.

Operatora new można używać nawet do tworzenia instancji obiektów należących do typów danych, które dopuszczają tworzenie instancji na podstawie wyrażeń literałowych. Na przykład poniższe dwa wiersze kodu są równoważne:

var someNumber:Number = 6.33; 
var someNumber:Number = new Number(6.33);

Tworzenie obiektów przy użyciu konstrukcji new NazwaKlasy () jest bardzo ważnym aspektem programowania w języku ActionScript. Dla wielu typów danych języka ActionScript nie istnieje reprezentacja ekranowa. Dlatego nie można ich tworzyć poprzez umieszczenie elementu na stole montażowym programu Flash Professional ani w trybie projektowania edytora MXML programu Flash Builder. Instancje danych tego typu można tworzyć w języku ActionScript wyłącznie za pomocą operatora new .

Adobe Flash Professional

W programie Flash Professional operator new pozwala także na utworzenie instancji symbolu klipu filmowego, który jest zdefiniowany w bibliotece, ale nie został umieszczony na stole montażowym.