Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 -从加载的swf或调用静态方法-如何为客户端电影公开API_Actionscript 3 - Fatal编程技术网

Actionscript 3 -从加载的swf或调用静态方法-如何为客户端电影公开API

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,里面装着(用一个加载器)另一部电影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_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));
        }
    }
}