外部swf加载和播放时的AS3主时延迟脚本

时间:2013-08-14 04:56:34

标签: actionscript-3 time flash delay

我在主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();

1 个答案:

答案 0 :(得分:0)

loader对象的load()方法是异步的。这意味着该过程将继续执行下一行代码并且加载是独立完成的。这就是为什么你可以看到它没有提示。

解决问题的简单方法是stop()所有加载的电影在Event.COMPLETEplay()加载所有电影后加载。

使用数组存储已加载的电影,并在加载所有电影后对其进行寻址。

是的,计时器黑客是没有意义的,你不知道文件加载需要多长时间,每次都可能不同。

修改

让我们假设你有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();
    }
}