Animowanie obiektów

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Animacja to proces, w którym obiekt zostaje przesunięty lub — innymi słowy — proces zmiany obiektu w czasie. Animacje skryptowe to podstawowa część gier wideo, która jest często wykorzystywana w celu udoskonalania i dodawania użytecznych operacji do innych aplikacji.

Fundamentem animacji skryptowych jest to, że do zmiany musi dojść, a zmiana musi zostać podzielona na fragmenty w czasie. W języku ActionScript powtarzanie określonych operacji jest łatwe, ponieważ możliwe jest wykorzystanie często stosowanej instrukcji pętli. Jednak przed aktualizacją wyświetlania nastąpi przejście wszystkich iteracji pętli. W celu utworzenia animacji skryptowej należy napisać kod ActionScript, który będzie powtarzał niektóre operacje w czasie, a każde jego uruchomienie będzie powodowało aktualizację zawartości ekranu.

Przykład: wyobraźmy sobie utworzenie prostej animacji, takiej jak toczenie się kulki na ekranie. Język ActionScript udostępnia prosty mechanizm, który umożliwia śledzenie przejścia kulki w czasie i odpowiednie aktualizowanie ekranu — to oznacza, że możliwe jest napisanie kodu, który będzie przesuwał kulkę o niewielką odległość za każdym razem, aż osiągnie ona miejsce docelowe. Po każdym ruchu powinno dojść do zaktualizowania ekranu, co spowoduje, że będzie prezentowany ruch przez cały stół montażowy.

Z praktycznego punktu widzenia sensowne jest synchronizowanie animacji skryptowych z liczbą klatek na sekundę w pliku SWF (tj. jedna zmiana animacji po każdym wyświetleniu nowej klatki lub przed jej wyświetleniem), ponieważ jest to częstotliwość, z jaką program Flash Player lub środowisko AIR aktualizuje ekran. Każdy obiekt wyświetlany zawiera zdarzenie enterFrame , które jest wywoływane zgodnie z liczbą klatek na sekundę pliku SWF — jedno zdarzenie na jedną klatkę. Większość programistów, którzy tworzą animacje skryptowe, korzysta ze zdarzenia enterFrame jako sposobu na powtarzanie określonych operacji w czasie. Możliwe jest napisanie kodu, który będzie wykrywał zdarzenie enterFrame i przesuwał animowaną kulkę o pewną odległość w każdej klatce, i w miarę odświeżania ekranu (w każdej klatce) kulka będzie ponownie rysowana w nowym położeniu, co będzie powodowało wrażenie ruchu.

Uwaga: Innym sposobem powtarzania operacji w czasie jest wykorzystanie klasy Timer. Instancja Timer wywołuje powiadomienie o zdarzeniu za każdym razem po upływie określonego czasu. Możliwe jest napisanie kodu, który będzie wykonywał animację poprzez obsługę zdarzenia licznika czasu klasy Timer, i zostanie ustawiony odpowiednio krótki okres czasu (część sekundy). Więcej informacji o korzystaniu z klasy Timer zawiera sekcja Sterowanie przedziałami czasu .

W poniższym przykładzie utworzono na stole montażowym instancję Sprite o nazwie circle . Gdy użytkownik kliknie okrąg, następuje rozpoczęcie sekwencji animacji skryptowej, co powoduje, że obiekt circle zanika (następuje zmniejszenie jego właściwości alpha ) aż staje się całkowicie przezroczysty:

import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 
 
// draw a circle and add it to the display list 
var circle:Sprite = new Sprite(); 
circle.graphics.beginFill(0x990000); 
circle.graphics.drawCircle(50, 50, 50); 
circle.graphics.endFill(); 
addChild(circle); 
 
// When this animation starts, this function is called every frame. 
// The change made by this function (updated to the screen every 
// frame) is what causes the animation to occur. 
function fadeCircle(event:Event):void 
{ 
    circle.alpha -= .05; 
     
    if (circle.alpha <= 0) 
    { 
        circle.removeEventListener(Event.ENTER_FRAME, fadeCircle); 
    } 
} 
 
function startAnimation(event:MouseEvent):void 
{ 
    circle.addEventListener(Event.ENTER_FRAME, fadeCircle); 
} 
 
circle.addEventListener(MouseEvent.CLICK, startAnimation);

Gdy użytkownik kliknie okrąg, następuje subskrypcja funkcji fadeCircle() w roli detektora zdarzenia enterFrame , co oznacza, że jest wywoływana raz dla każdej klatki. Ta funkcja powoduje zanikanie obiektu circle poprzez zmianę jego właściwości alpha — raz na klatkę właściwość alpha okręgu jest zmniejszana o .05 (5 procent), a ekran jest aktualizowany. Ostatecznie, gdy wartość alpha wynosi 0 (obiekt circle jest całkowicie przezroczysty), funkcja fadeCircle() przestaje być detektorem zdarzenia, co kończy animację.

Ten sam kod może zostać wykorzystany na przykład w celu utworzenia animowanego ruchu zamiast zanikania. Wprowadzenie innej właściwości zamiast właściwości alpha do funkcji, która jest detektorem zdarzenia enterFrame , powoduje animowanie tej właściwości. Na przykład: zmiana tej linii

    circle.alpha -= .05;

na taki kod

    circle.x += 5;

powoduje animowanie właściwości x , co sprawia, że okrąg przesuwa się w prawo na stole montażowym. Jako warunek zakończenia animacji (tj. anulowania roli detektora dla funkcji enterFrame ) można ustawić osiągnięcie wybranej współrzędnej x.