Eksportowanie symboli bibliotecznych dla kodu ActionScript

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

Domyślnie instancje symboli klipów filmowych z biblioteki dokumentu Flash nie mogą być tworzone dynamicznie (tj. tylko za pomocą kodu ActionScript). Wynika to z faktu, że każdy symbol wyeksportowany do użycia w kodzie ActionScript powiększa objętość pliku SWF i zakłada się, że niektóre symbole nie są przeznaczone do użycia na stole montażowym. Dlatego, aby dany symbol był dostępny w kodzie ActionScript, należy jawnie nakazać wyeksportowanie go dla kodu ActionScript.

Aby wyeksportować symbol dla kodu ActionScript:

  1. Zaznacz symbol w panelu Biblioteka i otwórz jego okno dialogowe Właściwości symbolu.

  2. W razie potrzeby uaktywnij ustawienia Zaawansowane.

  3. W sekcji Łączenie zaznacz pole wyboru Eksport dla ActionScript.

    Spowoduje to uaktywnienie pól Klasa i Klasa bazowa.

    Domyślnie w polu Klasa wpisywana jest nazwa symbolu z usuniętymi spacjami (np. symbol o nazwie „Zielony las" otrzymałby nazwę klasy „Zielonylas”). Aby wskazać, że zachowanie symbolu powinno być zdefiniowane przez klasę niestandardową, należy w tym polu wpisać pełną nazwę klasy, łącznie z nazwą pakietu. Aby uzyskać możliwość tworzenia instancji symbolu w kodzie ActionScript, bez dodawania niestandardowych zachowań, można pozostawić proponowaną nazwę klasy bez zmian.

    W polu Klasa bazowa domyślnie wpisywana jest nazwa flash.display.MovieClip . Jeśli symbol ma rozszerzać funkcjonalność innej niestandardowej klasy, można wprowadzić nazwę tej klasy, o ile tylko rozszerza ona klasę Sprite (lub MovieClip).

  4. Kliknij przycisk OK, aby zapisać zmiany.

    Na tym etapie, jeśli program Flash nie będzie mógł znaleźć powiązanego pliku SWC ani zewnętrznego pliku ActionScript z definicją określonej klasy (jeśli na przykład nie zachodziła konieczność dodawania do symbolu niestandardowego zachowania), zostanie wyświetlony komunikat:

    Definicja dla tej klasy nie została odnaleziona w ścieżce klasy, w związku z tym zostanie ona automatycznie wygenerowana w pliku SWF podczas eksportu .

    Można zignorować to ostrzeżenie, jeśli symbol biblioteczny nie wymaga funkcjonalności wykraczającej poza funkcjonalność klasy MovieClip.

Jeśli klasa dla symbolu nie zostanie określona, program Flash utworzy dla symbolu klasę równoważną następującej:

package 
{ 
    import flash.display.MovieClip; 
     
    public class ExampleMovieClip extends MovieClip 
    { 
        public function ExampleMovieClip() 
        { 
        } 
    } 
}

Aby dodać do symbolu niestandardową funkcjonalność zapisaną w języku ActionScript, należy dopisać odpowiednie właściwości i metody do poniższej struktury kodu. Załóżmy na przykład, że mamy symbol klipu filmowego zawierający okrąg o promieniu 50 pikseli i symbol ten został wskazany do eksportu dla kodu ActionScript w klasie Circle. Poniższy kod, który należałoby umieścić w pliku Circle.as, rozszerza klasę MovieClip i wyposaża symbol w dodatkowe metody getArea() i getCircumference() :

package  
{ 
    import flash.display.MovieClip; 
     
    public class Circle extends MovieClip 
    { 
        public function Circle() 
        { 
        } 
         
        public function getArea():Number 
        { 
        // The formula is Pi times the radius squared. 
        return Math.PI * Math.pow((width / 2), 2); 
        } 
         
        public function getCircumference():Number 
        { 
        // The formula is Pi times the diameter. 
        return Math.PI * width; 
        } 
    } 
}

Poniższy kod, umieszczony w klatce kluczowej nr 1 dokumentu Flash, utworzy instancję symbolu i wyświetli ją na ekranie:

var c:Circle = new Circle(); 
addChild(c); 
trace(c.width); 
trace(c.height); 
trace(c.getArea()); 
trace(c.getCircumference());

Ten kod ilustruje tworzenie instancji w kodzie ActionScript jako alternatywę dla przeciągania zasobów na stół montażowy. Tworzy okrąg mający wszystkie właściwości klipu filmowego oraz dodatkowe metody niestandardowe, zdefiniowane w klasie Circle. Jest to bardzo prosty przykład — klasa symbolu bibliotecznego może zawierać dowolną liczbę właściwości i metod.

Tworzenie instancji w języku ActionScript zapewnia szerokie możliwości, ponieważ pozwala na dynamiczne tworzenie dużej liczby instancji, co byłoby bardzo żmudne w przypadku pracy ręcznej. Jest to także rozwiązanie elastyczne, ponieważ pozwala na odpowiednie modyfikowanie właściwości każdej nowo tworzonej instancji. Prostą ilustracją obu tych korzyści byłoby użycie pętli do dynamicznego tworzenia kilku instancji klasy Circle. Po umieszczeniu w bibliotece dokumentu Flash opisanego wcześniej symbolu i klasy Circle dodaj następujący kod do klatki kluczowej pokrywającej się z klatką nr 1:

import flash.geom.ColorTransform; 
 
var totalCircles:uint = 10; 
var i:uint; 
for (i = 0; i < totalCircles; i++) 
{ 
    // Create a new Circle instance. 
    var c:Circle = new Circle(); 
    // Place the new Circle at an x coordinate that will space the circles 
    // evenly across the Stage. 
    c.x = (stage.stageWidth / totalCircles) * i; 
    // Place the Circle instance at the vertical center of the Stage. 
    c.y = stage.stageHeight / 2; 
    // Change the Circle instance to a random color 
    c.transform.colorTransform = getRandomColor(); 
    // Add the Circle instance to the current timeline. 
    addChild(c); 
} 
 
function getRandomColor():ColorTransform 
{ 
    // Generate random values for the red, green, and blue color channels. 
    var red:Number = (Math.random() * 512) - 255; 
    var green:Number = (Math.random() * 512) - 255; 
    var blue:Number = (Math.random() * 512) - 255; 
     
    // Create and return a ColorTransform object with the random colors. 
    return new ColorTransform(1, 1, 1, 1, red, green, blue, 0); 
}

Ten przykład demonstruje, jak łatwe jest programowe tworzenie i dostosowywanie wielu instancji symbolu. Położenie każdej instancji zależy od aktualnej wartości licznika pętli, a ponadto każda instancja otrzymuje losowy kolor. Odbywa się to poprzez nadanie wartości właściwości transform (którą klasa Circle odziedziczyła z klasy MovieClip).