0

私は次のことをしました

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 クラスは次のようになります。

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)。

前もって感謝します!

編集: たぶん質問です: メイン ムービーの読み込みが開始されたときを判断する方法はありますか?

4

2 に答える 2

1

最初のフレームのステージにプリローダー以外のコンテンツがないことを確認してください。そうしないと、プリローダーが起動する前にすべてのコンテンツをロードする必要があります。

于 2012-07-26T16:01:45.850 に答える
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);
    }

}

}
于 2012-07-26T14:50:10.387 に答える