加载和使用SWF文件

时间:2012-03-25 08:26:14

标签: actionscript-3 flash

我是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”中的boxesPrompt()函数只跟踪它的父,祖父和伟大的祖父 - 跟踪(this.parent.parent.parent);.当我使用“event.target.content.boxes.boxesPrompt()”在onLoaded事件处理程序中调用该函数时,它显示Boxes对象(位于External.SWF的主时间轴上)具有父动画片段,一个祖父精灵,一个伟大的祖父对象mainTimeline。

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

所以重新说一下,我的问题是:

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

  • 如何“重新加载”加载的内容,因此我可以将它放在加载程序文件的主时间轴上的某个movieclip / sprite中,而不是使用一些非常冗长的方式。

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

1 个答案:

答案 0 :(得分:2)

AS2&amp; AS3有很大的不同。但是你必须承认AS3已经发展成为对AS2的改进。所以你所做的任何过渡也都是好的。

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

话虽如此,让我来解答你的问题:

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

    您必须了解您才能访问该内容 加载后,所以必须等待它完成。 event.complete处理程序可能是你最好的选择。

  • 我怀疑你是否可以从加载的swf&amp;将其重新纳入当前的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