Иногда бывает необходимость создавать объекты внутри основного flash-модуля на основе классов, которые находятся в подгружаемом swf-файле. Это может быть изменчивый скин, различные анимированные икноки и т.п. Назвать этот процесс можно по разному, например аттач мувика из подгружаемого swf-файла или клонирование объектов из внешних файлов.
Для исполнения этого фокуса необходимо извлечь классы из загружаемого swf. А затем легко и непринужденно создавать на их основе объекты там где это Вам необходимо.
А делается это следующим образом:
1. Создаем swf файл содержащий в себе все необходимые классы. Делаем:
- Создаем новый fla файл
- Добавляем/создаем произвольный мувик
- Переходим в библиотеку (Ctrl + L)
- Щелкаем правой кнопкой на созданном мувике и выбираем из списка Properties
- Ставим галочки "Export for ActionScript" и "Export in first frame"
- Запоминаем (плохая память - записываем) имя класса в поле Class (в нашем примере: MyClass)
2. В основном модуле, например в классе Main, который цепляется к fla исходнику с основным содержимым добавляем:
package { import flash.display.Sprite; import flash.display.Loader; import flash.events.IOErrorEvent; import flash.net.URLRequest; public class Main extends Sprite { private var MyClass:Class; public function Main() { //Загружаем мувик var ldr:Loader=new Loader(new URLRequest("path/to/file_with_class.swf")); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplite); ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onError); } private function onComplite(e:Event):void { //Вытаскиваем класс MyClass=Class(ldr.contentLoaderInfo.applicationDomain.getDefinition("MyClass")); //Создаем объект на основе нового класса var obj = new MyClass(); //Убиваем ожидание событий чтобы не грузить оперативку ldr.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplite); ldr.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onError); } private function onError(e:IOErrorEvent):void { trace("Трабл однако :-(" + e.text); //Убиваем ожидание событий чтобы не грузить оперативку ldr.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplite); ldr.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onError) } } }
Вуаля! ActionScript 3 как всегда радует :)
PS... Один маленький нюанс...
Вот так:
obj:MyClass = new MyClass();
работать не будет и мы получим страшный еррор. Так что смело пишите
obj = new MyClass();