Actionscript 3 -从加载的swf或调用静态方法-如何为客户端电影公开API
我有一部主电影A,里面装着(用一个加载器)另一部电影B。在电影A中,我有一个类API,其中包含一系列在A中执行操作的静态方法Actionscript 3 -从加载的swf或调用静态方法-如何为客户端电影公开API,actionscript-3,Actionscript 3,我有一部主电影A,里面装着(用一个加载器)另一部电影B。在电影A中,我有一个类API,其中包含一系列在A中执行操作的静态方法 A.as public class Main extends MovieClip{ public Main() { b= new Loader(); b.load("b.swf"); addChild(b); } } ------- API.as public class API{ public static function DO_STUF
A.as
public class Main extends MovieClip{
public Main()
{
b= new Loader();
b.load("b.swf");
addChild(b);
}
}
-------
API.as
public class API{
public static function DO_STUFF() { ... }
}
-------
B.fla
API.DO_STUFF();
事实上,我不能执行最后一个调用,因为API类在编译时不可用(但它在运行时)。。我可以把这张支票推迟到运行时间吗?如何将API公开给加载的电影(由客户端完成)
我发现我可以在中创建接口/桥接功能,如下所示:
public function DO_STUFF() { API.DO_STUFF(); }
然后从B中调用这个:
MovieClip(parent.parent).DO_STUFF();
但我觉得它很难看,也不合适。。我更喜欢API.do_stuff()类型的调用
有解决办法吗?谢谢 我找到了一个简单的解决方案: 客户端必须使用以下命令声明API变量:
var API;
因此,在swf加载完成后,我可以将此变量与我的API类链接:
private function eventCompleteHandler(event:Event):void
{
event.target.content.API= API;
}
然后客户端可以使用API.func()调用任何API函数您可以通过键入该类引用,以最适当的方式执行该类引用,如下所示:
var API:Class;
在完整的处理程序中,您可以安全地获得:
import flash.utils.getDefinitionByName;
private function eventCompleteHandler(event:Event):void{
event.target.content.API = getDefinitionByName("API") as Class;
}
做到这一点的最好方法是投掷项目。直接调用函数不是一个好主意。相反,您可以在加载的类中侦听事件并在加载程序中分派它 A.as API.as 佛罗里达州 调度事件总是没有错误的。要么有人听它,要么它就消失了。A API.as(包括在A.swf中) B.as(B.swf的文件类)
非常有趣。我不喜欢B.fla中的语法(客户端写下来很难看),但我喜欢事件的临近。让我们看看我是否可以美化它。我不太确定你在哪里包括了API类。。您可以在A.as:b.content.addEventListener('DO_STUFF',DO_STUFF')中添加事件侦听器;然后B.fla中的代码将是这个.dispatchEvent(…)或简单的dispatchEvent(…)
public class Main extends MovieClip{
public Main()
{
b= new Loader();
b.load("b.swf");
addChild(b);
}
}
public class API{
public function API():void {
this.addEventListener('DO_STUFF',DO_STUFF);
}
public static function DO_STUFF() { ... }
}
// instead of API.DO_STUFF();
MovieClip(parent.parent).dispatchEvent(new Event('DO_STUFF'));
package
{
import flash.display.Sprite
import flash.display.Loader
import flash.events.Event
import flash.net.URLRequest
public class A extends Sprite
{
private var api:API;
public function A():void
{
api = new API();
var loader:Loader = new Loader();
loader.contentLoaderInfo.sharedEvents.addEventListener("DoStuff", DoStuff);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, AddSWF);
//normally put error listener in here
loader.load(new URLRequest("B.SWF"));
}
private function AddSWF(e:Event):void
{
// No Need to Load to Stage if no Visible Conent - just vars etc
//this.addChild(e.target.content);
}
private function DoStuff(e:Event):void
{
trace("Calling DoStuff in API Class");
api.DoAPIStuff();
}
}
}
package
{
public class API
{
public function API():void
{
trace("API Ready");
}
public function DoAPIStuff():void
{
trace("API is DoingStuff()");
}
}
}
/////////////////////////////////////////////////////////////////////////////////
{
import flash.display.Sprite
import flash.events.Event
public class B extends Sprite
{
public function B():void
{
trace("B Loaded");
loaderInfo.sharedEvents.dispatchEvent(new Event("DoStuff", true));
}
}
}