Пример фрагмента ролика: RuntimeAssetsExplorer

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Функция «Экспорт для ActionScript» особенно полезна для библиотек, которые могут использоваться для нескольких проектов. Если ПО Flash Player или AIR выполняет SWF-файл, символы, экспортированные в ActionScript, доступны любому SWF-файлу, находящемуся в той же изолированной программной среде, что и загружающий его SWF-файл. Таким образом, один документ Flash может сгенерировать SWF-файл, предназначенный исключительно для хранения графических объектов. Этот прием особенно полезен для больших проектов, в рамках которых дизайнеры, создающие визуальные ресурсы, могут работать параллельно с дизайнерами, создающими «упаковочный» SWF-файл, загружающий SWF-файл с графическими ресурсами во время выполнения. Этот метод можно использовать для обработки последовательности разных версий файлов, в которых графические ресурсы не зависят от процесса разработки программы.

Приложение RuntimeAssetsExplorer загружает любой SWF-файл, являющийся подклассом для RuntimeAsset, и позволяет просматривать доступные активы этого SWF-файла. Пример иллюстрирует следующие процессы:

  • загрузка внешнего SWF-файла с помощью метода Loader.load();

  • динамическое создание библиотечного символа, экспортированного для ActionScript;

  • управление воспроизведением экземпляра MovieClip с помощью ActionScript.

Прежде чем начинать, обратите внимание на то, что все SWF-файлы, предназначенные для воспроизведения в проигрывателе Flash Player, должны находиться в одной изолированной программной среде. Дополнительные сведения см. в разделе Изолированные программные среды.

Получить файлы приложения для этого примера можно на странице образцов Flash Professional. Файлы приложения RuntimeAssetsExplorer находятся в папке Samples/RuntimeAssetsExplorer. Приложение состоит из следующих файлов.

File

Описание

RuntimeAssetsExample.mxml

или

RuntimeAssetsExample.fla

Пользовательский интерфейс приложения для Flex (MXML) или Flash (FLA).

RuntimeAssetsExample.as

Класс документа для приложения Flash (FLA).

GeometricAssets.as

Пример класса, реализующего интерфейс RuntimeAsset.

GeometricAssets.fla

FLA-файл, связанный с классом GeometricAssets (класс документа для FLA), который содержит символы, экспортированные для ActionScript.

com/example/programmingas3/runtimeassetexplorer/RuntimeLibrary.as

Интерфейс, определяющий обязательные методы, которые должны иметь все SWF-файлы, содержащие динамические ресурсы, загружаемые в контейнер обозревателя во время выполнения.

com/example/programmingas3/runtimeassetexplorer/AnimatingBox.as

Класс библиотечного символа в виде вращающейся коробки.

com/example/programmingas3/runtimeassetexplorer/AnimatingStar.as

Класс библиотечного символа в виде вращающейся звезды.

Реализация динамического интерфейса библиотеки

Чтобы обозреватель правильно взаимодействовал с SWF-библиотекой, необходимо создать формальную структуру библиотек динамических ресурсов. Это достигается путем создания интерфейса, подобного классу в том, что он представляет собой схему методов, разграничивающих желаемую структуру, и отличного в том, что он не включает тел методов. Этот интерфейс обеспечивает связь между библиотекой динамических ресурсов и обозревателем. Каждый SWF-файл с динамическими ресурсами, загруженный в обозреватель, внедряет свой интерфейс. Дополнительные сведения об интерфейсах и их практическом применении см. в разделе «Интерфейсы» в руководстве Изучение ActionScript 3.0.

Интерфейс RuntimeLibrary будет очень простым. Нам просто требуется функция, которая может предоставить обозревателю массив путей к классам для символов, предназначенных для экспорта и доступных в библиотеке динамических ресурсов. С этой целью в интерфейсе предусмотрен только один метод: getAssets().

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

Создание SWF-файла библиотеки

Благодаря определению интерфейса RuntimeLibrary мы получили возможность создать несколько SWF-файлов для библиотеки ресурсов, которые могут загружаться в другой SWF-файл. Создание отдельной SWF-библиотеки ресурсов включает четыре этапа:

  • Создание класса для SWF-файла библиотеки ресурсов

  • Создание классов для отдельных ресурсов, содержащихся в библиотеке

  • Создание фактических графических ресурсов

  • Связывание графических элементов с классами и публикация SWF-библиотеки

Создание класса для реализации интерфейса RuntimeLibrary

Далее мы создадим класс GeometricAssets, который реализует интерфейс RuntimeLibrary. Это будет класс документа FLA. Код для этого класса очень похож на интерфейс RuntimeLibrary. Отличие между ними заключается в том, что в определении класса метод getAssets() включает тело метода.

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" ];     
        } 
    } 
}

Если бы потребовалось создать вторую библиотеку динамических ресурсов, мы бы создали еще один FLA-файл на базе другого класса (например, AnimationAssets), который обеспечивает собственную реализацию метода getAssets().

Создание классов для каждого ресурса MovieClip

В данном примере мы просто расширим класс MovieClip, не добавляя функций в пользовательские ресурсы. Следующий код для AnimatingStar аналогичен коду для AnimatingBox.

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

Публикация библиотеки

Теперь мы подключим ресурсы на базе MovieClip к новому классу путем создания нового FLA-файла и ввода GeometricAssets в поле «Класс документа» в инспекторе свойств. Для данного примера мы создадим две очень простые фигуры, использующие анимацию с временной шкалой (вращение по часовой стрелке на протяжении 360 кадров). Для символов animatingBox и animatingStar установлен флажок «Экспорт для ActionScript», а в поле «Класс» указаны соответствующие пути к классам, заданные при реализации getAssets(). Базовый класс по умолчанию flash.display.MovieClip остается без изменений, так как нам требуется создать подклассы на базе стандартных методов MovieClip.

Настроив параметры экспорта символа, опубликуйте FLA-файл. Первая библиотека динамических ресурсов готова. Этот SWF-файл можно загрузить в другой SWF-файл AVM2, и символы AnimatingBox и AnimatingStar будут доступны для нового SWF-файла.

Загрузка библиотеки в другой SWF-файл

На последнем этапе необходимо организовать пользовательский интерфейс для обозревателя ресурсов. В данном примере путь к библиотеке динамических ресурсов жестко закодирован как переменная с именем ASSETS_PATH. Также можно использовать класс FileReference, например, чтобы создать интерфейс, позволяющий просматривать определенный SWF-файл на жестком диске.

После успешной загрузки библиотеки динамических ресурсов проигрыватель Flash Player вызывает метод runtimeAssetsLoadComplete().

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

В этом методе переменная rl представляет загруженный SWF-файл. Код вызывает метод getAssets() загруженного SWF-файла, чтобы получить список доступных ресурсов, и заполняет этим списком компонент ComboBox, вызвав метод populateDropDown(). В свою очередь, этот метод сохраняет полный путь к классам каждого ресурса. Нажатие кнопки «Добавить» в пользовательском интерфейсе запускает метод addAsset().

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

Этот метод получает путь к классам текущего ресурса, выбранного в компоненте ComboBox (assetNameCbo.selectedItem.data), и использует функцию getDefinitionByName() (из пакета flash.utils) для получения фактической ссылки на класс ресурса, чтобы создать его новый экземпляр.