如何加载swf并与之交互?

Sef*_*ang 6 apache-flex flash swfloader actionscript-3

我试过SWFLoader,但问题是加载的内容是MovieClip,我不知道如何与它交互,而MovieClip#numChildren为零.

顺便说一下,我无法将闪光灯传递给瑞士法郎.

akm*_*ozo 3

首先,您应该知道您的问题没有确切的答案,因为它取决于您加载的 SWF(您是否知道,它的显示列表,...),但我将举一个简单的示例来解释事情,您有使其适应您的情况。

对于此示例,假设我们有一个非常简单的 SWF(加载的 SWF),其中包含一个 TextField(称为txt_url)和一个按钮(一个 MovieClip,称为btn_go)。

btn_go按钮将打开在文本字段中输入的 URL txt_url

对于我们的第二个 SWF(加载器),我们将使用一个Loader对象来加载第一个 SWF(在本例中为Loader.content),然后我们将设置 URL(txt_url文本)并触发按钮上的单击事件btn_go

这是我们的代码示例loader.swf

var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, on_SWFLoad);
    loader.load(new URLRequest('loaded.swf'));
    addChild(loader);

function on_SWFLoad(e:Event): void
{   
    // get our loaded SWF
    var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content);

    // because we know our target objects, we can use "getChildByName()"
    // set the URL
    TextField(loaded_swf.getChildByName('txt_url')).text = 'http://www.example.com';

    // open the URL in the browser by triggering the click event on the "btn_go" button
    MovieClip(loaded_swf.getChildByName('btn_go')).dispatchEvent(new MouseEvent(MouseEvent.CLICK));     
}
Run Code Online (Sandbox Code Playgroud)

此示例将在加载 SWF 后直接在浏览器中设置并打开 URL,当然我们可以在单击按钮或其他内容后执行该操作,但这只是一个简单的示例,向您展示如何执行此操作...

现在,问题是当我们对加载的 SWF 及其子文件(名称、深度等)一无所知时,在这种情况下我们应该付出更多努力来完成我们想要的事情:我们应该遍历整个显示列表加载的 SWF 的名称以识别目标对象。

回到我们的例子,假设我们只知道舞台中有一个 TextField 和一个按钮,所以我们的代码可以像这样:

function on_SWFLoad(e:Event): void
{
    var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content);
    var num_children:int = loaded_swf.numChildren;

    for(var i:int = 0; i < num_children; i++)
    {
        var child:DisplayObject = loaded_swf.getChildAt(i); 

        if(child is TextField)
        {
            trace(child.name);          // gives : txt_url
            TextField(child).text = 'http://www.example.com';
        }
        else 
        {
            if(child.hasEventListener(MouseEvent.CLICK))
            {
                trace(child.name);      // gives : btn_go
                child.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

再说一次,这是一个非常简单的例子,只是为了展示我们如何继续......

...

然后关于在 SWF 之间传递值(参数),请查看我对此问题的回答,其中有一个小示例。

有关显示编程(显示列表、显示对象、显示对象容器等)的更多信息,请查看此处

希望能有所帮助。