Получение класса из внешнего swf файла

к списку уроков

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

ДРУГИЕ УРОКИ ПО ActionScript 3

  • Создание градиента
  • Передача данных в архиве zip
  • Создание расширенного загрузчика (Loader)