2012-03-25 40 views
3

我是AS3的新手,想了解外部加载的SWF如何在AS3中工作。自Flash 4/5以来,通常在Flash Web项目中有一个主SWF文件,然后将其他SWF文件加载到其中,通常用于网站或Web项目的各个“部分”。在主文件中,我们将使用蒙版动画制作容器动画片段(其中加载了外部片段/ SWF文件),并在动画和转场随着片段完成加载并显示加载的内容时播放。加载和使用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的主时间轴上)具有父级动作片段,一个grand-parent sprite和一个伟大的祖父对象mainTimeline。

我想重新养育加载的内容到精灵将允许为使用loadMovie()曾经是我的轻松访问加载的内容 - 访问加载的内容就像是它在加载的剪辑中直接存在的,但这根本不起作用。

所以要改一下,我的问题是:

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

  • 如何“重新加载”加载的内容,因此我可以将它放在加载器文件的主时间轴上的某个movieclip/sprite内,而不是使用一些真正漫长的复杂方式。

  • 如何从加载内容到主/加载程序文件进行通信。之前,我们会使用_root.functionName()来执行一些操作,例如播放从当前外部加载的“部分”跳转到另一部分的动画。我怎么去做这件事。

回答

2

AS2 & AS3有很大的不同。但是你将不得不承认AS3已经发展为AS2的改进。所以你做的任何转换也是更好的。

对于例如:The _root在AS2允许全局对象&变量来访问&随时随地改变,这是一个不好的做法&导致非维护的代码中的一个项目。

说了这么多,让我解决您的问题:

  • 如果你能够获得访问加载的内容与 event.target.content ...你应该保存它里面,说类 变量&以后可能会在其他地方访问它的类。

    你必须明白,你将只能 加载它后访问的内容,所以必须等待它完成反正& event.complete处理程序可能是你最好的选择。

  • 我怀疑,如果你可以选择从加载的SWF &重新父它随机内容到当前swf.As解释你可能不会有很长的曲路。

  • 访问家长可以通过多种方式来实现。您可以使用.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获取更多信息。

+0

感谢您的帮助。这件事并不能安静工作,但你的改变提供了有用的见解。 后精灵= event.target.content;正如你所建议的那样,我必须再次添加Child()来显示它。尽管之前将精灵添加到显示列表中,但当它指向event.target.content(不在显示列表上的东西)时,它并未显示。 盒的母公司仍是SWF‘盒子’的‘根’影片剪辑坐在,并加载到精灵后,精灵包含一个影片剪辑(加载SWF的根)和影片剪辑包含框。我无法到达盒子,因为我不知道root的名字。 – Qasim 2012-03-26 06:49:57