2011-02-18 122 views
1

我有一个SWF主时间轴上的一个Flash动画,有几个图层,一些函数和一些关键帧标签。例如,我有一个碰到屏幕的明星的动画片段,然后触发主时间线的dispatchEvent去帧标签“下一个”。AS3加载程序不断重新加载相同的SWF

这里是主时间轴使用的ActionScript的示例:

Stars.addEventListener("fadeInTitle",_fadeInTitle); 

function _fadeInTitle(e:Event):void { 
    Title.gotoAndPlay("fadeIn"); 
    Stars.removeEventListener("fadeInTitle",_fadeInTitle); 
} 

stop(); 

也就是说SWF单独的作品完美。当我尝试将此SWF加载到另一个时,问题就出现了。 加载程序会一直重复加载SWF,并重叠它们,忽略加载的SWF的主时间轴上的动作,时间轴连续播放。这里是我用来加载SWF的代码:

import flash.net.URLRequest; 
import flash.display.Loader; 
import flash.events.Event; 
import flash.events.ProgressEvent; 

function startLoad(){ 
    var mLoader:Loader = new Loader(); 
    var mRequest:URLRequest = new URLRequest("Fly.swf"); 
    mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler); 
    mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler); 
    mLoader.load(mRequest); 
} 

function onCompleteHandler(loadEvent:Event){ 
    addChild(loadEvent.target.content); 
} 

function onProgressHandler(mProgress:ProgressEvent){ 
    var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal; 
} 

startLoad(); 

这里没有什么特别的。只是一个简单的装载机

我发现了一种解决方法,将整个动画放在一个主动画片段内,并将该动画片段放在主时间轴上(一个关键帧,一个图层,没有动作),然后加载它。这样它的工作正常,但它感觉更像是一个补丁而不是解决方案。我真的很想知道为什么当您尝试加载使用主时间轴的外部SWF以及多个图层,关键帧和动作时会出现问题。

任何帮助/提示将不胜感激。
非常感谢您的阅读。

m

+0

您是否尝试在startLoad()中放置断点以确保它只被调用一次? – Kai 2011-02-18 19:26:00

回答

0

首先从一个函数中取出loader实例,这是没有必要的。其次,在onComplete函数中杀掉你的监听器。第三,如果这个加载器代码位于加载器shell的时间轴上,确保不多于一个框架,或者如果存在(不知道为什么会有),在包含加载器代码的框架上放置一个停止。或者甚至更好,使用Document类来包含加载器代码,而不是放在时间轴上。我最好的猜测是你以某种方式再次调用startLoad()。另外,请确保已安装Flash调试播放器,以便在浏览器中查看时获得正确的错误报告。

var mLoader:Loader = new Loader(); 
var mRequest:URLRequest = new URLRequest("Fly.swf"); 
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler); 
mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler); 
mLoader.load(mRequest); 


function onCompleteHandler(loadEvent:Event) 
{ 
    mLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onCompleteHandler); 
    mLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgressHandler); 
    addChild(loadEvent.target.content); 
} 

function onProgressHandler(mProgress:ProgressEvent) 
{ 
    var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal; 
} 
+0

感谢您的回答,您的观点是正确的,我修改了加载程序,但它不是问题。我惊讶地发现了解决方案。我想对加载的fla文件做一些测试,所以我只是用另一个名字保存它,重新导出swf并在我的加载器中调用这个新的swf。根本没有改变代码或任何东西,它运作良好。我怀疑旧fla文件或某些随机内存错误会造成某种程度的损坏。 – 2011-02-19 05:47:13