AS3预加载器时序

时间:2012-07-26 14:08:48

标签: actionscript-3 flash

我做了以下

package classes 
{
// imports removed

public class Main extends MovieClip {

    // vars removed

    public function Main():void {

        trace('--> Main Function started ...');

        /**************************************
        Preloader
        **************************************/
        var preLoader:PreLoader = new PreLoader(); // init
        stage.addChild(preLoader); // to Stage
        stage.loaderInfo.addEventListener(ProgressEvent.PROGRESS,  preLoader.preloaderProgress); // calling the function

        doThis();
    }
}

PreLoader Class看起来像这样:

package classes  {

// imports removed

public class PreLoader extends MovieClip {

    public var totalBytes:uint;
    public var loadedBytes:uint;

    public function PreLoader() {
        trace('--> PRELOADER Started ...');
        this.addEventListener(Event.ADDED_TO_STAGE, addedHandler);

        this.loaderBar.scaleX = 0;
    }

    private function addedHandler(e:Event):void {
        trace('Adding Preloader ...');
        totalBytes = this.stage.loaderInfo.bytesTotal;
        trace('PL: Total ' + totalBytes + ' / ' + loadedBytes);

        this.removeEventListener(Event.ADDED_TO_STAGE, addedHandler);
        preloaderProgress(e);
    }

    public function preloaderProgress(e:Event):void {
        trace('Progress...');
        loadedBytes = this.stage.loaderInfo.bytesLoaded;
        this.loaderBar.scaleX = loadedBytes / totalBytes;
        this.loaderBar.alpha = 1 - this.loaderBar.scaleX;

        if (totalBytes == loadedBytes) {
            trace('Removing PreLoader ...');
            this.parent.removeChild(this);
        }
    }

}

}

问题:在初始SWF文件加载完成之前,不会显示预加载器。甚至所有的跟踪输出都是在主电影结束时开始的 - 我对'慢速连接'进行了一些分析。

如果你想知道:doThis()是从xml文件加载数据,从这里一切都很好,跟踪输出是在正确的时间(但是太迟了:D)

提前谢谢!

编辑:也许问题是:有没有办法确定主电影何时开始加载?

2 个答案:

答案 0 :(得分:1)

确保第一帧中的舞台上没有除预加载器之外的任何内容。否则,在预加载器启动之前必须加载所有内容。

答案 1 :(得分:0)

如果您在FlashIDE中工作,则必须将预加载器放入第一帧。如果您更喜欢使用其他IDE,则应使用Frame元标记。例如:

<强> Main.as

package com.sample.preloader
{
import flash.display.Sprite;
import flash.events.Event;

/**
 * ...
 * @author Author
 */
[Frame(factoryClass="com.sample.preloader.Preloader")]
public class Main extends Sprite 
{

    public function Main():void 
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // entry point
    }

}

}

<强> Preloader.as

package com.sample.preloader
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.utils.getDefinitionByName;

/**
 * ...
 * @author Author
 */
public class Preloader extends MovieClip 
{

    public function Preloader() 
    {
        if (stage) {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
        }
        addEventListener(Event.ENTER_FRAME, checkFrame);
        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
        loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

        // TODO show loader
    }

    private function ioError(e:IOErrorEvent):void 
    {
        trace(e.text);
    }

    private function progress(e:ProgressEvent):void 
    {
        // TODO update loader
    }

    private function checkFrame(e:Event):void 
    {
        if (currentFrame == totalFrames) 
        {
            stop();
            loadingFinished();
        }
    }

    private function loadingFinished():void 
    {
        removeEventListener(Event.ENTER_FRAME, checkFrame);
        loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
        loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);

        // TODO hide loader

        startup();
    }

    private function startup():void 
    {
        var mainClass:Class = getDefinitionByName("com.sample.preloader.Main") as Class;
        addChild(new mainClass() as DisplayObject);
    }

}

}