【问题标题】:How to pass variable From one Swf to another Swf in ActionScript3?如何在 ActionScript3 中将变量从一个 Swf 传递到另一个 Swf?
【发布时间】:2011-10-19 04:59:15
【问题描述】:

我在 as3 中有两个 swf(a.swf anb b.swf) 。现在我想将变量从 a.swf 传递到 b.Swf.i 请点击此链接Tutorial 我使用了加载器类。这里是我的编码。

var loader:Loader = new Loader();
loader.load("a.swf?test=hi");

但我收到错误消息

TypeError:错误 #1034:类型强制失败:无法将“textchat.swf?test=hi”转换为 flash.net.URLRequest。 在 BasicTickerSprite_fla::MainTimeline/frame1()

如何解决这个问题?如何将字符串从一个 Swf 传递到另一个 Swf? 任何人请详细解释我 提前谢谢

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    【讨论】:

    • 我投了赞成票,因为这是正确的做法。但是,在将来,请尝试提供更多信息,例如简单示例或说明如何使用它的链接。
    【解决方案2】:

    ExternalInterface 是一个不错的方法。

    也许更好的是 LocalConnection 类:

    http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/LocalConnection.html

    也许理解基本概念的良好开端来自 Stack Overflow 上提供的这个答案:

    How to pass a String from a SWF into another SWF

    由塑料鲟回答:

    让我们澄清一下:1.加载器swf,我们将调用父级。 2. 父加载的swf我们称之为子。

    子项包含一个字符串,并且您希望父项能够 读那个字符串> 所以...孩子必须定义一个公共变量 字符串。 (这意味着你必须为它使用一个 Class 文件,因为你 不能在时间轴上声明公共属性。)

    最后,父级将尝试获取该属性。你可能想要 将其包装在 try/catch 中以处理字符串不会出现的情况 现在。

    这是一个子类示例。

    package  
    {
    import flash.display.Sprite;
    
    /**
     * ...
     * @author Zach Foley
     */
    public class Child extends Sprite 
    {
        public var value:String = "This is the child Value";
        public function Child() 
        {
            trace("Child Loaded");
        }
    
    }
    }
    

    这里是父加载器类:

    package  
    {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    
    /**
     * ...
     * @author Zach Foley
     */
    public class Parent extends Sprite 
    {
        private var loader:Loader;
    
        public function Parent() 
        {
            trace("PArent Init");
            loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
            loader.load(new URLRequest("child.swf"));
        }
    
        private function onLoaded(e:Event):void 
        {
            trace("Child Loaded");
            trace(loader.content['value']);
        }
    
    }
    }
    

    输出将是: PArent Init Child Loaded Child Loaded 这是 子价值

    【讨论】:

    • +1 感谢您的友好回复,这对我来说非常有用。我在 a.swf 中声明了一个变量 var value:String = "This is the child Value";现在我调用 B.swf 中的值,这里是我的编码函数 onLoaded(e:Event):void { trace("Child Loaded");跟踪(loader.content['value']); } 装载机 = 新装载机(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded); loader.load(new URLRequest("a.swf"));
    • 我也收到错误消息 TypeError:错误 #1009:无法访问空对象引用的属性或方法。在 textchat_fla::MainTimeline/frame1()
    【解决方案3】:
    var loader:Loader = new Loader();
    loader.load(new URLRequest("http//localhost/a.swf?test=hi"));
    

    您需要一个本地服务器
    更新

        private var _ldr:Loader;
        private var _mc:MovieClip;
        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
    
        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            _ldr = new Loader();
            _ldr.contentLoaderInfo.addEventListener(Event.INIT, onInit);
            _ldr.load(new URLRequest('a.swf'));
        }
    
        private function onInit(e:Event):void{
            _mc = _ldr.content as MovieClip;
            _mc['test'] = 'hi';
            addChild(_mc);
        }
    

    【讨论】:

    • 我试过这个编码,我得到这样的错误,错误#2044:未处理的IOErrorEvent:。 text=错误 #2035:找不到 URL。
    • 再次出现同样的错误先生。请帮助我。我连接了我的本地服务器
    • 网页浏览器中是否打开了相同的网址?
    • 是相同的 url 先生,还有其他方法可以在 as3 中将字符串从一个 Swf 传递到另一个 Swf 吗?请指导我
    【解决方案4】:

    您可以使用ExternalInterface 对象在 SWF 之间实现更好的通信。

    查看here 以获取 adobe 参考。

    并查看以下链接。

    【讨论】:

      【解决方案5】:

      我知道这是一个老话题,但我最近不得不在多个 swf 之间引用一个 smartfox 服务器实例和变量。我想我会分享一下我是如何实现这一目标的基础知识。

      父SWF

      public var MyVar:String = "Hello";
      public var sfs:SmartFox = new SmartFox(true);
      private var ChildMC:MovieClip = new MovieClip();
      private var myLoader:Loader;
      
      private function LoadChildSWF(evt:Event):void //i used button click event to load swf
          {
          myLoader = new Loader();                     // create a new instance of the Loader class
          var url:URLRequest = new URLRequest("YOURSWF.swf"); // in this case both SWFs are in the same folder
          try
              {
                  myLoader.load(url);
                  myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,FFLoaded);
      
              } 
              catch (error:Error) 
              {
                  trace("Unable to load requested document.");
              }
          }
          function FFLoaded(e:Event):void
          {
              ChildMC= myLoader.content as MovieClip;
              addChild(ChildMC);
              ChildMC.init(this);
      
          }
          public function RemoveChildMC():void
          {
              removeChild(ChildMC);
              ChildMC=null;
          }
      

      ChildSWF

      package
      {
      import com.smartfoxserver.v2.SmartFox;
      
      public class ChildDocumentClass extends MovieClip
      {
          private var refDocument:*;
          private var ChildVar:String;
          private var sfs:SmartFox;
          public function ChildDocumentClass()
          {
              trace("Initilise ChildDocumentClass");
              // Nothing to do
          }
          public function init(refDoc:*):void
          {
              // Get the references to the Document Class
              refDocument = refDoc;
              // Get the references to the Server Instance
              sfs=refDocument.sfs;
          //Pass Parent Variable to child variable 
              ChildVar=refDocument.MyVar;
          }
      //call to parent class function example to remove loaded swf
          private function UnloadThisSWF():void
          {
              refDocument.RemoveChildMC();
          }
      }
      }
      

      如您所见,可以通过init(refDoc:*)函数将父类传递给子类来实现通信。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-24
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多