2012-07-26 51 views
0

我做了以下AS3預載定時

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(); 
    } 
} 

隨着預加載類看起來像這樣:

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); 
     } 
    } 

} 

}

問題:預加載不顯示inital BEFORE SWF文件已完成加載。即使所有的追蹤輸出都是在主要電影完成時開始的 - 我做了一些關於「慢速連接」的分析。

如果你想知道:doThis()從XML文件加載數據,從這裏一切都很好,跟蹤輸出是在正確的時間(但爲時已晚,在所有:d)

預先感謝您!

編輯:也許問題是:有什麼方法可以確定主電影何時開始加載?

回答

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); 
    } 

} 

} 
+0

謝謝!我沒有完全理解你的意思是「把你的預加載器放到第一幀」,因爲電影中沒有任何東西需要文檔類和預加載器類。有沒有辦法將文檔類放入第二個框架? init()方法是一個非常好的技巧!謝謝你! – Rockbot 2012-07-27 09:08:25

+0

再次打招呼。我修改了PreLoader.as,並將其用作我的Flash文件的文檔類 - 對嗎?現在我得到一個錯誤:_Error#1065:變量主未定義._ - 'var mainClass:Class = getDefinitionByName('classes.Main')作爲類;'我錯過了什麼? – Rockbot 2012-07-27 10:08:15

+0

hello :)不,您必須使用Main.as作爲文檔類。 – eleven 2012-07-27 10:18:40

1

確保你沒有比預加載其他任何內容在舞臺上的第一幀。否則,在preloader啓動之前,所有內容都必須加載。

+0

謝謝!同樣在這裏:如果電影是空的,除了文檔類和preloader類 - 如何做到這一點?順便說一句:文檔級將元素放在舞臺後面... – Rockbot 2012-07-27 09:10:33

+0

看到這個論壇帖子 - 我認爲它解釋了你正在經歷的。 http://www.actionscript.org/forums/showthread.php3?t=197265 – duggulous 2012-07-27 19:19:53