【问题标题】:AS3, loading in a SWF as a custom typeAS3,将 SWF 作为自定义类型加载
【发布时间】:2009-10-12 14:33:08
【问题描述】:

这里的基本问题。通常在 AS3 中,您通过 Loader 加载 SWF,您得到的是某种“Loader”类型的伪 MovieClip。

假设 SWF 是使用自定义类型的基类发布的,是否有任何神圣的方法可以将此加载的 SWF 转换为扩展 MovieClip 而不是 Loader 的自定义类型?没有数据丢失?

或者,假设你不能,你甚至可以从扩展 Loader 本身的自定义类型转换它吗?

【问题讨论】:

    标签: actionscript-3 actionscript casting flash


    【解决方案1】:

    你可以这样做:

    存根 swf 中的代码:

    package {
    
        import flash.display.MovieClip;
    
        public class Stub extends MovieClip implements IStub {
    
            public function Stub() {
                trace("Stub::ctor");
            }
    
            public  function traceIt(value:String):void {
                trace("Stub::traceIt " + value);
            }
        }
    }
    

    我正在使用一个接口,但这不是绝对必要的。

    package {
    
        public interface IStub {
    
            function traceIt(value:String):void;
    
        }
    }
    

    “主”swf 中的代码。

    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.INIT,handleInit);
    loader.load(new URLRequest("Stub.swf"));
    
    function handleInit(e:Event):void {
        var stub:Stub = loader.content as Stub;
    //  or, using an interface 
    //  var stub:IStub = loader.content as IStub;
        stub.traceIt("testing");
    }
    

    【讨论】:

      【解决方案2】:

      根据this article in the LiveDocs 上的 cmets,您可以将 Loader.content 投射到 MovieClip 并以这种方式访问​​它。

      但是,有一些限制。例如,SWF 本身必须是一个 AS3 SWF 文件,并且执行加载的 SWF 和正在加载的 SWF 应该共享同一个沙箱。

      【讨论】:

        【解决方案3】:

        是的,loader.content 让您可以访问已加载的任何内容。您应该能够简单地将其转换为您想要的任何内容。

        或者,您可以选择扩展 Loader,它已经扩展了 DisplayObjectContainer,因此您将拥有 MovieClip 的大部分功能。在这种情况下,编写它以便您可以简单地调用 MyCustomClass.load(swf here),它应该可以满足您的需要。

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-12
          • 1970-01-01
          • 2012-07-28
          • 1970-01-01
          相关资源
          最近更新 更多