我正在尝试手动加载生成的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
答案 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
后调用该函数