0

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

1 回答 1

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();
    }
}
于 2013-08-14T05:09:08.593 回答