2012-07-26 39 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