我在主SWF中播放外部SWF时遇到问题。一切都很好,除了提示。我使用简单的延迟动作脚本来暂停主时间轴,直到外部SWF加载,但在浏览器中进行测试时,它并不总是同步。
是否有AS3代码可用于暂停主时间轴,直到外部SWF完成加载和播放? 我需要通过电影多次这样做,顺便说一句......
以下是延迟和我使用的loadmovie
数组。
<--------------//Timer//--------------->
var timer4:Timer = new Timer(1500, 1);
timer4.addEventListener(
TimerEvent.TIMER,
function(evt:TimerEvent):void {
play();
}
);
timer4.start();
<--------------//loadMovie//--------------->
function startLoad()
{
var mLoader:Loader = new Loader();
var mRequest:URLRequest = new URLRequest('flip/note_flip.swf');
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
mLoader.load(mRequest);
}
function onCompleteHandler(loadEvent:Event)
{
addChild(loadEvent.currentTarget.content);
}
function onProgressHandler(mProgress:ProgressEvent)
{
var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;
trace(percent);
}
startLoad();
答案 0 :(得分:0)
loader对象的load()
方法是异步的。这意味着该过程将继续执行下一行代码并且加载是独立完成的。这就是为什么你可以看到它没有提示。
解决问题的简单方法是stop()
所有加载的电影在Event.COMPLETE
和play()
加载所有电影后加载。
使用数组存储已加载的电影,并在加载所有电影后对其进行寻址。
是的,计时器黑客是没有意义的,你不知道文件加载需要多长时间,每次都可能不同。
修改强>
让我们假设你有N个电影.swf文件来制作一个完整的场景。你想加载所有这些,一旦它们全部加载 - 播放它们。
让我们构建一个简单的逐步逻辑:
1)首先,我们需要一个指向外部SWF所在位置的URL列表。
2)然后我们要开始逐个加载SWF(而不是完全加载)以防止Flash Player无法加载某些内容并保持影片剪辑的顺序,即z-index,深度,图层顺序等错误
3)在每个加载的电影中,我们计算还有多少还要加载。
4)加载所有电影后,我们play()
所有这些电影。
以下是您的代码(如果您没有使用类并且不熟悉OOP,则以框架形式编写):
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.MovieClip;
var linkArray:Array = ["1.swf", "2.swf", "3.swf"];
var loadedMovieArray:Array = [];
var totalMovies:int = linkArray.length;
var loadedMovies:int = 0;
var urlRequest:URLRequest = new URLRequest();
var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(Event.COMPLETE, onMovieLoaded);
loadMovies();
function loadMovies():void
{
var movieIndex:int = loadedMovies;
var movieURL:String = linkArray[movieIndex];
urlRequest.url = movieURL;
l.load(urlRequest);
}
function onMovieLoaded(e:Event):void
{
var loadedMC:MovieClip = l.content as MovieClip;
loadedMC.stop();
loadedMovieArray.push( loadedMC );
loadedMovies++;
if (loadedMovies == totalMovies)
onAllMoviesLoaded();
else
loadMovies();
}
function onAllMoviesLoaded():void
{
for (var i:int = 0; i < loadedMovieArray.length; i++) {
var mc:MovieClip = loadedMovieArray[i];
addChild(mc);
mc.play();
}
}