【问题标题】:Loading and using SWF files加载和使用 SWF 文件
【发布时间】:2012-04-09 04:05:18
【问题描述】:

我是 AS3 的新手,正在尝试了解外部加载的 SWF 在 AS3 中的工作原理。自 Flash 4/5 以来,通常在 Flash Web 项目中拥有一个主 SWF 文件,然后将其他 SWF 文件加载到其中,通常用于网站或 Web 项目的各个“部分”。在主文件中,我们将使用掩码为容器动画剪辑(其中加载了外部部分/SWF 文件)设置动画,并在部分完成加载并显示加载的内容时播放动画和过渡。

在 AS3 中,我使用 Loader 类来加载和显示外部文件,我的主要问题是与加载的内容通信、调用它的函数或从中调用根函数。

在 AS2 中,我们可以使用 someMovieClip.loadMovie("ExternalContent.swf") 并且 ExternalContent 文件将加载到 someMovieClip 中。您可以使用 someMovieClip.function(); 访问“External.swf”主时间线上的函数。在“ExternalContent.swf”中,我们可以使用 _root.function() 来访问正在加载的主文件 ExternalContent 中的函数。在 AS3 中这样做似乎很奇怪和神经质,我觉得我在这里缺少一些相当基本的东西。

//Loading in ExternalContent.swf into the sprite
//ExternalContent has a movieclip called "boxes" on it's main timeline
//boxes has a boxesPrompt() function in it's timeline.

var sprite:Sprite = new Sprite();
addChild(sprite);

var loader:Loader = new Loader();
loader.load(new URLRequest("ExternalContent.swf"));

loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded);

function onLoaded(event:Event):void
{
    sprite.addChild(event.target.content);

        sprite.boxes.boxesPrompt();
        //Flash gives the following compiler error at the above
        //Scene 1, Layer 'Layer 1', Frame 1, Line 21 1119: Access of possibly undefined property boxes through a reference with static type flash.display:Sprite.

        //But when I comment out sprite.boxes.boxesPrompt() and use this, it works:
        event.target.content.boxes.boxesPrompt()
}

“ExternalContent.swf”中的 boxPrompt() 函数只是跟踪它的父、祖父和曾祖父 - trace(this.parent.parent.parent);。当我使用“event.target.content.boxes.boxesPrompt()”在 onLoaded 事件处理程序中调用该函数时,它显示 Boxes 对象(位于 External.SWF 的主时间轴上)有一个父动画剪辑、祖父精灵和曾祖父对象 mainTimeline。

我认为将加载的内容重新设置到 sprite 中可以让我像以前的 loadMovie() 一样轻松访问加载的内容 - 访问加载的内容就像它直接存在于加载它的剪辑中一样。但是根本不起作用。

换个说法,我的问题是:

  • 如何从主“加载器”SWF 文件与加载的内容进行通信。我不想使用 event.target.content.{etc} 进行通信,因为那样我只会能够在加载器的 event.complete 事件处理程序中处理加载的内容。

  • 我如何“重新加载”加载的内容,这样我就可以将其放置在加载器文件主时间轴上的一些影片剪辑/精灵中,而不是使用一些非常长的复杂方式。

  • 如何从加载的内容内部与 main/loader 文件进行通信。以前,我们会使用 _root.functionName() 来做一些事情,比如播放一些从当前外部加载的“部分”到另一个部分的动画过渡。我是怎么做到的。

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    AS2 和 AS3 大不相同。但是您将不得不接受这样一个事实,即 AS3 是作为对 AS2 的改进而开发的。因此,您所做的任何过渡都是为了更好。

    例如:AS2 中的 _root 允许在任何地方访问和更改全局对象和变量,这是一种不好的做法,会导致项目中的代码不可维护。

    说了这么多,让我来回答你的问题:

    • 如果您能够访问加载的内容 event.target.content...您应该将其保存在一个类中 变量 & 可以稍后在类的其他地方访问它。

      您必须了解您将只能访问内容 加载后,所以无论如何都要等待它完成& event.complete 处理程序可能是您最好的选择。

    • 我怀疑您是否可以从加载的 swf 中选择随机内容并将其重新设置为当前 swf。正如解释的那样,您可能没有很长的复杂方式。

    • 可以通过多种方式访问​​父级。您可以使用 .parent 或实际从父 swf 调用一个函数,将其引用传递给子。


    var sprite;
    addChild(sprite);
    
    var loader:Loader = new Loader();
    loader.load(new URLRequest("ExternalContent.swf"));
    
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded);
    
    function onLoaded(event:Event):void
    {
            sprite = event.target.content;
    
            //This should work
            sprite.boxes.boxesPrompt();
    }
    

    请参阅this example 了解更多信息。

    【讨论】:

    • 感谢您的帮助。事情并没有安静下来,但是您的更改提供了有用的见解。 sprite = event.target.content 之后;正如你所建议的,我不得不再次 addChild() 让它显示。尽管先前将精灵添加到显示列表中,但当它指向 event.target.content(不在显示列表中的东西)时,它没有显示。 Boxes的父级仍然是SWF“boxes”所在的“root”movieclip,加载到sprite后,sprite包含一个movieclip(加载SWF的根),movieclip包含boxes。我无法到达盒子,因为我不知道根的名字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多