• AS3的SWF与SWF交互问题 [返回文章列表]     发表于: 2008-10-17  1020人(次)浏览
  • 在AS2里SWF与SWF交互是非常容易的,可在AS3里一切都似乎复杂化了。 
    主SWF访问子SWF:
    比如有两个SWF。main.swf 、game.swf,main.swf加载game.swf。main 里有个按钮 _btn,game.swf里有一个gameMc:MovieClip 。 
    当按m1时,gameMc暂停播放。 
    在AS2里可以方便的写: 
    var mc=this.createEmptyMovieClip("mc",10) 
    var  loader:MovieClipLoader=new MovieClipLoader() 
    loader.loadClip("game.swf",mc) 
    loader.addListener(loadListener) 
    var loadListener=new Object() 
    loadListener.onLoadInit = function(target_mc:MovieClip) { 
     _btn.onRelease=function(){  
    target_mc. gameMc.stop() 



    可是如果在AS3里直接这样操作的话是会出错的,有2个新地方要注意: 
    ApplicationDomain、LoaderContext、 
    在main.as: 
    package {  
        import flash.display.MovieClip;  
        import flash.events.*;  
        import flash.display.Loader;  
        import flash.net.URLRequest;  
        import flash.events.ProgressEvent;  
        import flash.system.ApplicationDomain  
        import flash.system.LoaderContext  
         import flash.display.SimpleButton 
        public class main extends MovieClip {  
            var _loader:Loader;  
            var _swfArray:Array;  
            var _urlRequest:URLRequest;  
               public function main() {  
                _swfArray=["game.swf","link.swf","news.swf"];  
                _loader=new Loader();   
                 _btn.addEventListener(MouseEvent.CLICK,cm1);   
                var loadContxt= new LoaderContext(false,ApplicationDomain.currentDomain)  

    /*这个在更复杂的例子中会遇到,比如

    RuntimeAssetsExplorer。www.adobe.com/go/learn_programmingAS3samples_flash_cn

    */
                _loader.contentLoaderInfo.addEventListener(Event.INIT,loaded);  
                _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,loading);  
                 _loader.load(new URLRequest(_swfArray[n]));   
                  
            }  
           
            function loaded(e=null) {  
                trace("加载完成...");  
                var mc:*=e.target.content;  
                //mc.name="mc";  
                  
                addChild(mc);  
            }  
            function cm1(e=null) {  
                var mc:*=_loader.content  
                mc.gameMc.stop()  
            }  
        }  
    }
    子SWF访问主SWF:
    当按了下game.swf里的gameMc:MovieClip,让main.swf的按钮_btn为不可见
    game.as
    package { 
        import flash.display.MovieClip; 
        import flash.events.*; 
        public class game extends MovieClip { 
            public var gameMcs; 
            public function game() { 
                //gameMc.stop() 
                gameMcs="hrrrrrrh"; 
                trace("kkk"); 
                gameMc.buttonMode=true; 
                gameMc.useHandCursor=true; 
                gameMc.addEventListener(MouseEvent.CLICK,setAlpha); 
            } 
            public function Test() { 
                return ("s"); 
            } 
            public function setAlpha(e=null) { 
                e.target.play(); 
                                 
                this.parent[’_btn’].visible=false; 
                         
                         } 
        } 
    }

     

    最后,翻阅AS3帮助可以知道:

    LoaderContext(checkPolicyFile:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)
    checkPolicyFile 属性
    :指定 Flash Player 是否应在开始加载对象本身之前,尝试从所加载对象的服务器上下载跨域策略文件。 此标志适用于 Loader.load() 方法,但不适用于 Loader.loadBytes() 方法。

    如果是使用 Loader.load() 方法下载 SWF 文件,也尽量不要将 checkPolicyFile 设置为 true。 这是因为 SWF 到 SWF 的权限不是由策略文件控制的,而是由 Security.allowDomain() 方法控制的,因此在加载 SWF 文件时 checkPolicyFile 不起任何作用。 在这种情况下不必再检查是否存在策略文件,因为这样会延迟 SWF 文件的下载,并且可能会不必要地占用网络带宽 (Flash Player 无法判断您的主下载将是 SWF 文件还是图像,这是因为策略文件下载先于主下载进行)。

    applicationDomain 属性
    (这里比较重要一点):

    指定用于 Loader.load()Loader.loadBytes() 方法的应用程序域。 只应在加载使用 ActionScript 3.0 编写的 SWF 文件(不是图像或使用 ActionScript 1.0 或 ActionScript 2.0 编写的 SWF 文件)时才使用此属性。

    每个安全域被分成一个或多个由 ApplicationDomain 对象表示的应用程序域。 应用程序域并不是用于安全目的;它们用于管理 ActionScript 代码的协作单元。 如果是从其它域加载 SWF 文件,并允许将它放置到另外一个安全域中,则您将无法控制所加载的 SWF 文件被放置到哪个应用程序域中;即使您指定应选择某个应用程序域,也会忽略。 但是,如果是将 SWF 文件加载到您自己的安全域中(因为此 SWF 文件来自您自己的域,或者您正在将它导入到您的安全域中),您就可以控制为所加载的 SWF 文件选择哪个应用程序域。

    LoaderContext.applicationDomain 中,您只可以传递您自己的安全域中的应用程序域。 如果试图传递任何其它安全域中的应用程序域,则会引发 SecurityError 异常。

    securityDomain 属性
    :指定用于 Loader.load() 操作的安全域。 只应在加载 SWF 文件(而不是图像)时使用此属性。

AS3的SWF与SWF交互问题 [返回文章列表]