在swfs之间共享代码

时间:2009-09-24 16:50:21

标签: flex actionscript-3 mxmlc rsl

假设我有两个swfs A和B,并且在运行时,swf A加载swf B,我希望在它们之间共享代码,以最小化文件大小和下载时间。

如果swf B有一些代码(比如.com.blah.HelloWorld),我告诉编译器在swf A的类路径中有swf B的源代码,但只做一个编译时链接而不是实际编译com.blah.HelloWorld进入瑞士法郎A.

这是有效的,我已经尝试过,使用-includes和-externs编译器选项。

然而,我的问题是我希望以另一种方式这样做。即swf A和B(以及可能是swf C)都需要com.blah.HelloWorld,但我希望将com.blah.HelloWorld编译成swf A,将它作为swf B中的外部引用(也可能是C) 。)

我尝试使用externs和includes来做这个,但是当我这样做时我得到了ReferenceErrors。

我想在没有单独的rsl 的情况下执行此操作,因此我可以减少http请求的数量。 这可能吗?

3 个答案:

答案 0 :(得分:1)

您可以将Flex应用程序拆分为modules

或者您可以使用getDefinition类的ApplicationDomain方法从运行时加载的SWF中访问各个类:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
loader.load(new URLRequest("c.swf"));
//..
private function onLoad(e:Event):void
{
  var domain:ApplicationDomain = LoaderInfo(e.target).applicationDomain;
  var Type:Class = domain.getDefinition("pack.MyComponent") as Class;
  var myBox:Sprite = new Type();
  addChild(myBox);
}

答案 1 :(得分:0)

我不确定我是否完全理解您的问题,但我认为您可以使用AS3 Loader类来执行您想要的操作。格式将是这样的 - 假设我们正在创建您的主应用程序(将被称为“a.swf”)并且您想要访问已编译到另一个应用程序(称为“b.swf”)的方法和属性),你这样做:

var SWFB:Object; // empty at first as a placeholder.

var url:URLRequest  = new URLRequest("b.swf");
var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
l.load(url);

function loaded(e:Event):void {
 SWFB = e.currentTarget.content as Object;
 initApp();
}

function initApp():void {
 SWFB.someMethodCall();
}

......我认为那会有用。我现在无法测试它,但试试看,让我知道。基本上你将把b.swf加载为一个基本对象,然后你可以调用该对象的方法。

如果有效,请告诉我,如果没有,我明天可以为你改进。

答案 2 :(得分:0)

我不确定这是否正是您想要的,但您可以使用一些javascript来让两个swfs一起工作。

这是一个教程:

http://greeneggsandcam.com/tutorials/connect-2-swfs