2009-11-03 46 views
0

我试图设置一个预加载器来显示主SWF的负载进度,其中嵌入了所有的资产。我发现工厂类方法为described on bit-101,但似乎没有显示加载进度。 swf加载正常,但bytesLoaded总是等于bytesTotal,因此preloader永远不会被调用。主SWF预加载器问题

这是工厂类我使用

package src 
{ 
import flash.display.DisplayObject; 
import flash.display.MovieClip; 
import flash.display.StageScaleMode; 
import flash.display.StageAlign; 
import flash.events.Event; 
import flash.utils.getDefinitionByName; 

/** 
    * ... 
    * @author DefaultUser (Tools -> Custom Arguments...) 
    */ 
public class Factory extends MovieClip 
{ 
    private var preloader:Preloader; 

    public function Factory() 
    { 
    stop(); 
    stage.scaleMode = StageScaleMode.NO_SCALE; 
    stage.align = StageAlign.TOP_LEFT; 
    addEventListener(Event.ENTER_FRAME, enterFrame); 
    } 

    public function enterFrame(e:Event):void 
    { 
    trace(root.loaderInfo.bytesLoaded, root.loaderInfo.bytesTotal); 

    if (framesLoaded == totalFrames) { 
    removeEventListener(Event.ENTER_FRAME, enterFrame); 
    nextFrame(); 
    init(); 
    } 
    else { 
    var percent:Number = root.loaderInfo.bytesLoaded/root.loaderInfo.bytesTotal; 
    trace(percent); 
    } 
    } 

    private function init():void 
    { 
    var mainClass:Class = Class(getDefinitionByName("Main")); 
    if (mainClass) { 
    var mainApp:Object = new mainClass(); 
    addChild(mainApp as DisplayObject); 
    mainApp.init(); 
    } 
    } 

} 

} 

呼吁enterFrame事件的跟踪显示bytesLoaded和BYTESTOTAL是相等的。

这是swf加载时调用的Main类。

package 
{ 
import flash.display.Sprite; 

[Frame(factoryClass="src.Factory")] 

public class Main extends Sprite 
{ 
    [Embed(source="images/FinalImg01.jpg")] 
    private var Image1:Class; 
    [Embed(source="images/FinalImg02.jpg")] 
    private var Image2:Class; 
    [Embed(source="images/FinalImg03.jpg")] 
    private var Image3:Class; 

    public function init():void 
    { 
    trace("loaded"); 
    } 
} 

} 

这首先正确地调用工厂类,然后instansiates主要和调用init()。但正如我上面提到的那样,预加载从未显示,因为它似乎正在加载所有的东西。

这是一个问题,我嵌入图像的方式或因为我在本地测试?

还有人遇到过这些问题吗?

感谢 丰富

+0

雅,看来你是在本地测试它,这就是为什么它是在一杆得到加载。尝试使用一些其他沉重的图像(最好不要在你的系统上,可以从网上下载)。 – bhups 2009-11-03 14:50:01

回答

0

我已经成功地在我所有的游戏中使用同样的方法,它可以远程测试,作为本地测试几乎是自动加载之前加载所有字节可以反应。

所以是的,这是因为你在本地进行测试。将SWF上传到您的网络服务器,您可以从那里看到实际的加载进度。如果你有一个快速连接,为测试目的而人为地膨胀你的文件也不会受到伤害。

0

您使用的是什么版本的Flash?我知道预加载在CS2中的工作方式与CS3中的非常不同。我有一个类似的问题,让一个预装载器在CS3中工作一段时间。在采取任何其他行动之前

http://www.senocular.com/flash/tutorials/faq/

要使用AS3总结了SWF文件的整个库将被下载。要解决此问题,您可以告知每个库项目不要在第1帧中加载,然后在第一帧中设置预加载器。

另一个解决方案是将一个单独的SWF文件用于执行预加载。只要预加载器SWF加载完成,它就可以使用Loader对象加载较大的SWF文件。然后,Loader对象提供了获取通过事件加载多少数据的方法。

第三种解决方案是将SWF文件上传到像MochiAds这样的网站,并允许他们提供预加载功能。如果你正在制作游戏,这将是最简单的解决方案。

0

我没有使用Flash,所以不会在上面提到的第一帧解决方案上进行表达,因为我没有直接访问库或时间线。工厂方法是一种在纯ActionScript中实现此功能的方法,如果您正在Flash IDE之外开发,则必须使用此方法。

经过一番研究,我发现问题来自FlashDevelop的实现。实际上,最新的FlashDevelop版本中内置了一个模板,可以实现相同的结果,而不会不必要地导入大量的Flex组件。

退房这个职位,如果你需要任何更多信息

http://www.flashdevelop.org/community/viewtopic.php?f=13&t=3365