Actionscript 3 - Библиотеки скриптов - PullRequest
2 голосов
/ 17 января 2012

Я пытаюсь загрузить полученный SWF-файл сборки SWC вручную.Из-за моей конкретной среды нам необходимо разделить определения классов в swcs (где это имеет смысл), чтобы удалить избыточный код из выходных swfs.

В двух словах, я определяю класс (LibA) в SWF, который я строю с compc.Я компилирую его как в формат SWC, так и в каталог, так что я могу легко извлечь library.swf из каталога для загрузки во время выполнения (внешнее связывание) и использовать SWC для компиляции из любого SWF, созданного либо с Flash CS5, либо с mxmlc.

LibA.as :

package
{
    public class LibA
    {
        public function LibA()
        {
            trace("*** LibA()");
        }
    }
}

Main.as :

package
{
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;

    public class Main extends Sprite
    {
        private var self:Main;
        private var context:LoaderContext;

        public function Main()
        {
            var l:Loader = new Loader();
            self = this;

            l.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event) {
                self.addChild(l.content);

                var liba:LibA = new LibA();
            });
            l.load(new URLRequest("./libs/build/liba.swf"));
        }
    }
}

Я создаю каталог swc /swc с

compc -output libs/build/liba.swc -include-sources libs/LibA.as -debug=true

и я устанавливаю соответствующую связь в настройках AS3 во Flash CS5 при сборке Main (класс связан непосредственно со сценой).

Всепубликует без проблем.

Однако во время выполнения я получаю VerifyError: Error #1014: Class LibA could not be found.

Что мне здесь не хватает?Я хочу иметь возможность загружать и использовать классы, определенные в liba.swf из моего Main.swf.

Полный дамп трассировки:

verify Function/<anonymous>()
                        stack:
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  0:getlex 4
                        stack: Main?
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  2:getlex 7
                        stack: Main? flash.display::Loader?
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  4:getproperty content
                        stack: Main? flash.display::DisplayObject?
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  6:callpropvoid addChild 1
                        stack:
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  9:findpropstrict LibA
                        stack: Object
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  11:constructprop 10 0
                        stack: *
                        scope: [global Object$ flash.events::EventDispatcher$ flash.display::DisplayObject$ flash.display::InteractiveObject$ flash.display::DisplayObjectContainer$ flash.display::Sprite$ Main$ Main Main] 
                         locals: Object flash.events::Event? * 
  14:coerce LibA
VerifyError: Error #1014: Class LibA could not be found.

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Если вы хотите загрузить классы из SWF, вам нужно сделать что-то вроде (в вашем обработчике событий):

var li:LoaderInfo = e.target as LoaderInfo; // get the loaderInfo object from the event
var swf:MovieClip = li.loader.content as MovieClip; // get the swf
var c:Class = swf.loaderInfo.applicationDomain.getDefinition( "LibA" ) as Class; // get the class definition for LibA

Создание нового c должно дать вам LibAобъект.Вам понадобится полное определение класса в качестве имени.

Если я понимаю, что вы пытаетесь сделать, я уверен, что вы можете настроить SWC для встраивания внешней библиотеки - это выполучить завершение кода, но ни один из классов не включен, и SWC ищется во время выполнения.

EDIT

Только что попробовал что-то вроде того, что вы делаете.В моем примере выше, когда вы создаете c, если вы отследите его, он отследит LibA.Однако, если вы явно ссылаетесь на него, вы получите ошибку, которую вы описали.Я думаю, это связано с тем, что Flash путается с двумя определениями LibA - тем, на которое ссылались, и тем, которое вы загружаете - они находятся в 2 разных доменах приложения.

Исправление@turbosqel описывает это, загрузите его с помощью LoaderContext объекта:

var l:Loader = new Loader();
var context:LoaderContext = new LoaderContext( false, ApplicationDomain.currentDomain );
l.contentLoaderInfo.addEventListener(Event.COMPLETE, this._onLoadComplete );
l.load(new URLRequest("./libs/build/liba.swf"), context);

Это работает для меня, теперь я могу явно ссылаться на класс LibA.

0 голосов
/ 17 января 2012

liba не существует, пока ваш SWF не загружен, потому что вы не импортируете его в main.

Что означает, что во время компиляции его там нет

Переместите var liba:LibA = new LibA(); в вызов функции в загруженном корне SWF и вызовите функцию после загрузки e.currentTarget.someFunc

...