Przykład z klipem filmowym: RuntimeAssetsExplorer

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

Funkcja „Eksport dla ActionScript” bywa szczególnie przydatna w przypadku bibliotek potencjalnie wykorzystywanych w więcej niż jednym projekcie. Gdy program Flash Player lub środowisko AIR wykonuje plik SWF, symbole wyeksportowane dla kodu ActionScript są dostępne dla dowolnego pliku SWF w tym samym obszarze izolowanym co plik SWF, do którego je wyeksportowano. Tym sposobem jeden dokument Flash może być podstawą do utworzenia pliku SWF, którego jedynym przeznaczeniem będzie przechowywanie zasobów graficznych. Ta technika jest szczególnie użyteczna w większych projektach, w których równolegle pracują dwa zespoły — graficy i programiści. Programiści tworzą „opakowanie” grafiki w postaci wydzielonego pliku SWF, a program ładuje ten plik SWF w czasie wykonywania. Powyższa metoda umożliwia zarządzanie szeregiem wersji plików, w których zasoby graficzne są niezależne od postępów programowania.

Aplikacja RuntimeAssetsExplorer jest w stanie załadować dowolny plik SWF będący podklasą klasy RuntimeAsset i umożliwia przeglądanie zasobów dostępnych w tym pliku SWF. Przykład ilustruje następujące operacje:

  • Ładowanie zewnętrznego pliku SWF przy użyciu metody Loader.load() .

  • Dynamiczne utworzenie symbolu bibliotecznego wyeksportowanego dla kodu ActionScript.

  • Sterowanie odtwarzaniem w obiekcie MovieClip za pomocą kodu ActionScript.

Przed rozpoczęciem należy zwrócić uwagę, że każdy plik SWF przeznaczony do uruchomienia w programie Flash Player musi znajdować się w tym samym obszarze izolowanym. Więcej informacji zawiera sekcja Obszary izolowane .

Aby uzyskać pliki tej przykładowej aplikacji, należy pobrać pakiet przykładów do programu Flash Professional . Pliki aplikacji RuntimeAssetsExplorer znajdują się w folderze Samples/RuntimeAssetsExplorer. Aplikacja składa się z następujących plików:

File

Opis

RuntimeAssetsExample.mxml

lub

RuntimeAssetsExample.fla

Interfejs użytkownika dla aplikacji Flex (MXML) lub Flash (FLA).

RuntimeAssetsExample.as

Klasa dokumentu dla aplikacji Flash (FLA).

GeometricAssets.as

Przykład klasy, która implementuje interfejs RuntimeAsset.

GeometricAssets.fla

Plik FLA powiązany z klasą GeometricAssets (klasą dokumentu pliku FLA) i zawierający symbole wyeksportowane dla kodu ActionScript.

com/example/programmingas3/runtimeassetexplorer/RuntimeLibrary.as

Interfejs, który definiuje wymagane metody spodziewane we wszystkich plikach SWF z zasobami ładowanych do eksploratora.

com/example/programmingas3/runtimeassetexplorer/AnimatingBox.as

Klasa symbolu bibliotecznego w kształcie obracającego się prostokąta.

com/example/programmingas3/runtimeassetexplorer/AnimatingStar.as

Klasa symbolu bibliotecznego w kształcie obracającej się gwiazdy.

Tworzenie interfejsu biblioteki do użytku w czasie wykonywania

Aby interakcja eksploratora z biblioteka SWF przebiegała prawidłowo, konieczne jest sformalizowanie struktury bibliotek zasobów przeznaczonych do wykorzystania w czasie wykonywania. W tym celu utworzymy interfejs. Interfejs przypomina klasę w tym, że jest szablonem metod wyznaczającym określoną strukturę, jednak w przeciwieństwie do klasy nie zawiera treści metod. Interfejs umożliwia komunikację między biblioteką a eksploratorem w czasie wykonywania. Każdy plik SWF z zasobami ładowany do naszej przeglądarki będzie implementował ten interfejs. Więcej informacji o interfejsach i sposobach ich wykorzystania zawiera sekcja Interfejsy w publikacji Poznajemy język ActionScript 3.0 .

Interfejs RuntimeLibrary będzie bardzo prosty — potrzebna nam jest tylko funkcja udostępniająca eksploratorowi zestaw ścieżek klas symboli, które zostały wyeksportowane i są dostępne w bibliotece. Dlatego interfejs zawiera tylko jedną metodę: getAssets() .

package com.example.programmingas3.runtimeassetexplorer 
{ 
    public interface RuntimeLibrary 
    { 
        function getAssets():Array; 
    } 
}

Tworzenie pliku SWF z biblioteką zasobów

Zdefiniowanie interfejsu RuntimeLibrary otwiera drogę do utworzenia wielu różnych plików SWF z zasobami. Każdy taki plik będzie można załadować do innego pliku SWF. W celu utworzenia jednego pliku SWF zawierającego bibliotekę zasobów należy wykonać cztery zadania:

  • Utworzyć klasę dla pliku SWF z biblioteką zasobów.

  • Utworzyć klasy dla poszczególnych zasobów zawartych w bibliotece.

  • Utworzyć faktyczne zasoby graficzne.

  • Skojarzyć elementy graficzne z klasami i opublikować plik SWF z biblioteką.

Tworzenie klasy implementującej interfejs RuntimeLibrary

Kolejnym krokiem będzie utworzenie klasy the GeometricAssets implementującej interfejs RuntimeLibrary. Będzie to klasa dokumentu FLA. Kod tej klasy jest bardzo podobny do kodu interfejsu RuntimeLibrary — różnica polega na tym, że w definicji klasy metoda getAssets() ma treść.

package 
{ 
    import flash.display.Sprite; 
    import com.example.programmingas3.runtimeassetexplorer.RuntimeLibrary; 
     
    public class GeometricAssets extends Sprite implements RuntimeLibrary  
    { 
        public function GeometricAssets() { 
             
        } 
        public function getAssets():Array { 
            return [ "com.example.programmingas3.runtimeassetexplorer.AnimatingBox", 
                     "com.example.programmingas3.runtimeassetexplorer.AnimatingStar" ];     
        } 
    } 
}

Gdybyśmy mieli utworzyć drugą bibliotekę przeznaczoną do ładowania w czasie wykonywania, utworzylibyśmy drugi plik FLA oparty na innej klasie (na przykład AnimationAssets), która miałaby swoją własną implementację metody getAssets() .

Tworzenie klas dla poszczególnych zasobów typu MovieClip

W tym przykładzie ograniczymy się do rozszerzenia klasy MovieClip, bez dodawania funkcjonalności do zasobów niestandardowych. Poniższy kod klasy AnimatingStar jest analogiczny do kodu AnimatingBox:

package com.example.programmingas3.runtimeassetexplorer 
{ 
    import flash.display.MovieClip; 
     
    public class AnimatingStar extends MovieClip 
    { 
        public function AnimatingStar() { 
        } 
    } 
}

Publikowanie biblioteki

Teraz powiążemy zasoby oparte na klasie MovieClip z nową klasą, tworząc nowy plik FLA i wprowadzając nazwę GeometricAssets w polu Klasa dokumentu w Inspektorze właściwości. Na potrzeby tego przykładu utworzymy dwa bardzo proste kształty z osią czasu animacji polegającej na obrocie w prawo na przestrzeni 360 klatek. Dla symboli animatingBox i animatingStar wybieramy opcję Eksport dla ActionScript, a w polu Klasa wpisujemy odpowiednie ścieżki klas określone w implementacji metody getAssets() . Domyślna klasa podstawowa flash.display.MovieClip nie ulega zmianie, ponieważ chcemy rozszerzać standardowe metody klasy MovieClip.

Po skonfigurowaniu ustawień eksportu symbolu publikujemy plik FLA. Mamy teraz gotową pierwszą bibliotekę przeznaczoną do ładowania w czasie wykonywania. Ten plik SWF można załadować do innego pliku SWF AVM2. Wówczas symbole AnimatingBox i AnimatingStar staną się dostępne w tym nowym pliku SWF.

Ładowanie biblioteki do innego pliku SWF

Ostatnim elementem funkcjonalnym, jakim musimy się zająć, jest interfejs eksploratora zasobów. W tym przykładzie ścieżka do biblioteki ładowanej w czasie wykonywania jest zakodowana na stałe w zmiennej o nazwie ASSETS_PATH . Zamiast tego moglibyśmy jednak użyć klasy FileReference — np. w celu utworzenia interfejsu pozwalającego użytkownikowi na wybranie konkretnego pliku SWF na dysku twardym.

Po pomyślnym załadowaniu biblioteki program Flash Player wywołuje metodę runtimeAssetsLoadComplete() :

private function runtimeAssetsLoadComplete(event:Event):void 
{ 
    var rl:* = event.target.content; 
    var assetList:Array = rl.getAssets(); 
    populateDropdown(assetList); 
    stage.frameRate = 60; 
}

W tej metodzie zmienna rl reprezentuje załadowany plik SWF. Kod wywołuje metodę getAssets() załadowanego pliku SWF, uzyskując w ten sposób listę dostępnych zasobów i na podstawie tej listy wypełnia składnik ComboBox, wywołując metodę populateDropDown() . Z kolei ta metoda zapisuje pełne ścieżki klas poszczególnych zasobów. Kliknięcie przycisku Add w interfejsie użytkownika wywołuje metodę addAsset() :

private function addAsset():void 
{ 
    var className:String = assetNameCbo.selectedItem.data; 
    var AssetClass:Class = getDefinitionByName(className) as Class; 
    var mc:MovieClip = new AssetClass(); 
    ... 
}

Metoda ta pobiera ścieżkę klas zasobu wybranego w danej chwili w składniku ComboBox ( assetNameCbo.selectedItem.data ) i wywołuje funkcję getDefinitionByName() (z pakietu flash.utils) w celu uzyskania rzeczywistego odwołania do zasobu klasy w celu utworzenia nowej instancji tego zasobu.