如何在ActionScript3中将变量从一个Swf传递到另一个Swf?

时间:2011-10-19 04:59:15

标签: flash actionscript-3

我在as3中有两个swf(a.swf anb b.swf)。现在我想要传递变量从a.swf到b.Swf.i,请点击此链接Tutorial 我使用了Loader Class.Here my Coding。

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? 任何人请详细解释我 Thaks in Advance

5 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

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

Plastic Sturgeon回答:

  

让我们澄清一下:1。加载器swf,我们将调用父进程。 2。   由父母加载的swf我们会给孩子打电话。

     

Child包含一个字符串,您希望父级能够   读取该字符串>所以......孩子必须为。定义一个公共变量   字符串。 (这意味着你必须为它使用一个Class文件   不能在时间表上公开财产。)

     

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

     

以下是Child Class的示例。

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子载入子载入这是   子价值

答案 2 :(得分:1)

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);
    }

答案 3 :(得分:0)

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

查看here以获取adobe参考。

并查看以下链接。

答案 4 :(得分:0)

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

ParentSWF

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:*)函数将父类传递给子类可以实现通信。