Иногда бывает необходимость создавать объекты внутри основного 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();
