2010-11-05 3 views
8

У меня есть множество графических активов во фле, MovieClips связаны с некоторыми классами. Я экспортирую fla как swc, который я добавляю в свою библиотеку с опцией «Слияние в код».Работа с SWC - проблема getDefinitionByName

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

 //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() как I на примере 2, не прибегая к примеру 3 решения.

+0

Что такое полное имя класса для «GraphicAsset»? Это просто «GraphicAsset» или есть пакет? –

+0

Нет, я не использую пакет. Обратите внимание, что пример 1 и 3 работает нормально, за исключением примера 3 непрактично – PatrickS

ответ

10

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

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

var newMc:GraphicAsset; 

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

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

из другого места полностью, и он будет работать так, как вы ожидаете.

Это возможно (и довольно часто), чтобы найти две линии в seaprate SWFs. В этом случае один swf загрузил бы другой swf во время выполнения. Как правило, погрузчик швейцарских франков будет один с помощью getDefinitionByName("SomeClass) и загружены швейцарских франков будет тот, который определяет class SomeClass, и использует var a:SomeClass;, чтобы гарантировать, что класс будет построен в швейцарских франков.

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

class MyLibraryManifest { 

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

    //... and so on... 

} 

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

see adobe's site для объяснения параметров командной строки mxmlc.

Возможные варианты также могут быть specified in a config file, что позволяет вам контролировать, как flex и/или Flash IDE будут вызывать компилятор за кулисами.

удачи!

+0

Да, это более или менее то, что я делаю в данный момент. У меня есть класс, который является просто списком переменных. Всякий раз, когда я добавляю новый актив, я просто добавляю новую переменную в список. Я надеялся, что смогу избежать этого шага. Спасибо за Ваш ответ! – PatrickS

+0

@PatrickS - просто добавлено редактирование, представляющее альтернативу, используя параметры командной строки для компилятора mxmlc (я должен каждый раз просматривать его). ;) – Lee

+0

интересно !!! :) отлично, посмотрим! спасибо! – PatrickS

1

Использование FlashDevelop - это довольно просто исправить.

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

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

+0

Это все еще работает? Когда я пытаюсь сделать это, я все равно получаю ту же проблему. Нужно ли мне устанавливать какие-либо параметры компиляции в SWC или что-то еще? –