Actionscript 3 - 脚本库

时间:2012-01-16 23:27:35

标签: actionscript-3 mxmlc swc compc

我正在尝试手动加载生成的swc版本的swf。由于我的特定环境,我们需要将类定义分隔为swcs(在有意义的地方)从输出swfs中删除冗余代码。

简而言之,我正在使用LibA构建的swf中定义一个类(compc)。我正在将它编译为swc和目录格式,因此我可以轻松地从目录中提取library.swf以在运行时加载(外部链接)并使用swc从任何使用Flash CS5或{{1}构建的swf编译出来}。

LibA.as

mxmlc

Main.as

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

我使用

构建swc /目录swc

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")); } } }

在构建compc -output libs/build/liba.swc -include-sources libs/LibA.as -debug=true(直接链接到舞台的类)时,我在Flash CS5的AS3设置中设置了适当的链接。

一切都在没有问题的情况下发布。

但是,在运行时我得到Main

我在这里缺少什么?我希望能够从我的VerifyError: Error #1014: Class LibA could not be found.加载和使用liba.swf中定义的类。

完整跟踪转储:

Main.swf

2 个答案:

答案 0 :(得分:2)

如果要从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在运行时搜索。

修改

尝试了类似于你正在做的事情。在上面的示例中,当您创建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类。

答案 1 :(得分:0)

在加载SWF之前,liba不存在,因为您没有将其导入main。

这意味着在编译时它不存在

var liba:LibA = new LibA();移动到加载的swf根目录上的函数调用中,并在加载e.currentTarget.someFunc后调用该函数