我是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()来做一些事情,比如播放从当前外部加载的“部分”转换到另一部分的动画。我怎么去做那件事。
答案 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。