AS3 встраивает или импортирует все классы во внешний SWF без ссылки на каждый класс в отдельности - PullRequest
6 голосов
/ 21 июня 2009

У меня есть файл ArtLibrary.swf, в котором экспортированы сотни видеороликов с именами классов. Я хочу использовать эти фильмы в нескольких разных флеш-файлах, над которыми я работаю, но не знаю, как правильно ссылаться на них после использования и вставлять команду.

Следующие работы:

[Embed(source="ArtLibrary.swf", symbol="BirdBodyColor_mc")]
var BirdBodyColor_mc:Class;

myMC:MovieClip = new BirdBodyColor_mc();
addChild(myMC);

В этом примере я не уверен, как ссылаться на отдельные классы внутри «мастер-класса».

[Embed(source="ArtLibrary.swf")]
var MasterClass:Class;

myMC:MovieClip = new BirdBodyColor_mc();
addChild(myMC.BirdBodyColor_mc);

Ответы [ 6 ]

4 голосов
/ 23 июня 2009

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

В Flex вы можете обойти это с помощью аргумента командной строки, но это не так в CS4. Вместо этого у вас есть явная ссылка на классы, которые вы хотите использовать хотя бы один раз, таким образом, чтобы компилятор мог их понять. Например, я сделал простой SWC, который содержал символ с его классом, установленным в «TestCircle». В коде, который использовал SWC, у меня был следующий код, и он работал просто отлично:

import flash.utils.getDefinitionByName;

TestCircle;

var test:MovieClip =  new (getDefinitionByName("TestCircle") as Class)();

addChild(test);

Если вам захочется придумать, вы можете написать небольшой скрипт, который откроет SWC-файл (это всего лишь zip-файл), прочитайте XML-манифест, который находится внутри, и автоматически создайте специальный класс «includeder». Но, как говорится, я оставлю это как упражнение для читателя! ; -)

Надеюсь, это поможет!

4 голосов
/ 22 июня 2009

Вместо использования SWF лучше использовать SWC. Чтобы создать SWC, просто перейдите в настройки публикации Flash Pro, перейдите на вкладку Flash и выберите «Экспорт SWC». SWC содержит как SWF, так и специальный манифест со всей информацией, которую Flash должен знать о классах в SWF.

Затем, чтобы использовать SWC в другом проекте, перейдите в настройки AS3 (также на вкладке «Flash» настроек публикации), перейдите на вкладку «Путь к библиотеке» и добавьте SWC (как абсолютные, так и относительные пути работают нормально). 1003 *

Обратите внимание, что это будет работать только в CS4 или Flex (с Flex я уверен, что вы можете просто перетащить SWC в свой проект, но я проверю это).

Теперь - если вы хотите загрузить SWF-файл и использовать его ресурсы во время выполнения, это совсем другой шарик воска. Чтобы это работало правильно, вам нужно поиграться с классом Loader и ApplicationDomain, чтобы классы были помещены в соответствующий домен. Вот хорошая информация по этому вопросу:

http://www.kirupa.com/forum/showpost.php?p=2123134&postcount=366

3 голосов
/ 07 апреля 2010

Если вы хотели стать мог бы написать небольшой сценарий, который бы взломать SWC (это просто почтовый индекс файл), прочитайте манифест XML внутри и создайте специальный «включатель» класс автоматически. Но как говорится - Я оставлю это в качестве упражнения для читатель! ; -)

Не нужно делать ничего сложного (к счастью!). Аргумент компилятора include-library будет автоматически включать все классы из вашего SWC, позволяя методу getDefinitionByName работать как положено.

В вашем файле App-config.xml (или, альтернативно, напрямую передан компилятору в качестве аргумента):

<include-libraries>
    <library>path/to/your.swc</library>
</include-libraries>

Тогда вы можете использовать getDefinitionByName как обычно.

НТН.

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

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

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

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

0 голосов
/ 26 июня 2018

Да,

этот ответ приходит на 9 лет позже, но вы можете сделать это, не создавая ссылку, используя ApplicationDomain. Итак, представьте, что у вас есть классы, связанные с вашими Moveiclips в base_library.swf, который вы загружаете в свой основной SWF. У одного мувиклипа есть связка классов «Slide2». В вашем основном SWF у вас есть

    private function loadSWF():void {
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
        loader.load(new URLRequest("./lib/base_library.swf"));
    }

    private function onComplete(e:Event):void {
        trace(" ON COMPLETE LOAD ");
        var movie:* = LoaderInfo(e.currentTarget).content;

        // now try and create an instance of a slide
        var mc:MovieClip = createInstance(movie,"Slide2", "slide2");
        addChild(mc);
    }

    public function createInstance(mc:MovieClip, className:String, instName:String):MovieClip
    { 
        var cls:Class = mc.loaderInfo.applicationDomain.getDefinition(className) as Class;
        if (cls)
        {
            var instMC:MovieClip = new cls();
            instMC.name = instName;
            return instMC;
        }
        return null;
    }
0 голосов
/ 25 июня 2009

Так что я все еще застрял в написании длинного, вручную созданного скрипта, который ссылается на каждый импортированный класс. Разумеется, строки намного короче метода встраивания, даже один термин.

В конце концов, я создал свой ArtLibrary.fla, а затем просто скопировал и вставил все папки из библиотеки этого флага в каждый из 5 других моих флагов. Я не стал компилировать файл SWF. Для моих нужд это было самым эффективным.

Большое спасибо за помощь. Ваши ответы были простыми и очень подробными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...