Работа с SWC - проблема getDefinitionByName - PullRequest
8 голосов
/ 05 ноября 2010

У меня есть куча графических ресурсов в FLA, мувиклипы связаны с некоторыми классами. Я экспортирую fla как swc, который добавляю в свою библиотеку с опцией «Объединить в код».

Все отлично работает, я могу создавать экземпляры моих мувиклипов, просто вызывая их классы следующим образом.

     //example 1
     var newMc:BaseClass = new GraphicAsset();

Теперь, если я хочу сделать следующее, Flash выдает ошибку, GraphicsAssetClass имеет значение null!

    //example 2
    var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

Единственный способ заставить вышеуказанную строку работать - это сделать

    //example 3
    var newMc:GraphicAsset;
    var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

    //then I'm able to do this 
    var newMc:BaseClass = new GraphicsAssetClass();

Можете ли вы придумать решение, в котором я мог бы просто получить класс, вызвав getDefinitionByName () как я делаю в примере 2, не прибегая к примеру 3 решения.

Ответы [ 2 ]

11 голосов
/ 05 ноября 2010

Проблема в том, что компилятор исключит любой класс, на который нет прямой ссылки где-то в вашем коде. Это оптимизация, которую компилятор применяет по проекту .

Обычный способ обойти это точно так, как вы показали в своем «примере 3». Но важно отметить, что две линии не обязательно должны быть вместе в одном месте. Пока

var newMc:GraphicAsset;

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

var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

откуда-то еще, и все будет работать так, как вы ожидаете.

Даже возможно (и довольно часто) найти две строки в sefrate SWFs . В этом случае один SWF будет загружать другой SWF во время выполнения. Как правило, загрузчик swf будет тот, который использует getDefinitionByName("SomeClass), а загруженный swf будет тот, который определяет class SomeClass и использует var a:SomeClass;, чтобы гарантировать, что класс встроен в SWF.

По этой причине вы часто находите класс с именем что-то вроде «MyLibraryManifest», определенный в «SWF библиотеки», а затем на который ссылаются из основного мувиклипа этого SWF. Класс «manifest» тогда будет выглядеть так:

class MyLibraryManifest {

   private var a:GraphicAsset;
   private var b:SomeClass;
   private var c:SomeOtherClass;

   //... and so on...

}

[edit] Вы можете использовать опции -includes или -include-libraries для компилятора mxmlc, чтобы заставить компоновщик включать один или несколько отдельных классов (или весь swc), без применения "оптимизации сокращения" Я описал выше.

см. Сайт Adobe для объяснения параметров командной строки mxmlc.

Параметры также могут быть , указанные в файле конфигурации , что позволяет вам контролировать, как flex и / или Flash IDE будут вызывать компилятор за кулисами.

удачи!

1 голос
/ 21 февраля 2012

Используя FlashDevelop, это довольно просто исправить.

Щелкните правой кнопкой мыши включенный SWC в списке проектов.Выберите параметры, затем «включить библиотеку (полная библиотека)».

.. теперь вы можете использовать getDefinitionByName, чтобы получить класс без ссылок из файла swc.

...