AS3 Loader不断重复加载相同的swf

时间:2011-02-18 18:43:49

标签: actionscript-3 flash loader timeline loaded

我在SWF的主时间轴上制作了一个flash动画,其中包含几个图层,一些函数和一些关键帧标签。例如,我有一个星形的动画片段来到屏幕,然后触发主时间轴的dispatchEvent转到帧标签“next”。

以下是主时间轴上使用的动作脚本示例:

Stars.addEventListener("fadeInTitle",_fadeInTitle);

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

stop();

SWF单独运作完美。当我尝试将此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时它会出现问题。

非常感谢任何帮助/提示 非常感谢阅读。

1 个答案:

答案 0 :(得分:0)

首先从一个函数中获取加载器实例化,这是没有必要的。其次,在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;
}