CS5 + AS3预加载器的起始值为50%;不知道为什么

时间:2013-04-02 02:21:53

标签: actionscript-3 flash preloader flash-cs5

我知道有很多关于预加载器的先前主题,我试图跟随它们中的每一个但我仍然遇到同样的问题(他们帮助我从80%开始 - > 50%) 现在它从61450 / 125207开始,约为50%。

这是我的Main Document(整个项目的默认类文件)类:

public class MainDocument extends MovieClip
{
    private var preloader:Preloader;
    private var sB:startButton;
    public function MainDocument() 
    {
        preloader = new Preloader();
        preloader.x = 300;
        preloader.y = 400;
        addChild(preloader);
        loaderInfo.addEventListener(Event.COMPLETE,addStartButton,false,0,true);
    }
    private function addStartButton(e:Event):void
    {
        sB = new startButton();
        sB.x = 300;
        sB.y = 450;
        sB.addEventListener(MouseEvent.CLICK,sMainMenu,false,0,true);
        addChild(sB);
        loaderInfo.removeEventListener(Event.COMPLETE,addStartButton);
    }
    private function sMainMenu(e:Event):void
    {
        sB.removeEventListener(MouseEvent.CLICK,sMainMenu);
        removeChild(sB);
        removeChild(preloader);
        sB = null;
        preloader = null;           
        var menuScreen = new MenuScreen();
        addChild(menuScreen);

        //I have heard that the following code might work better:
        //var menuScreen:Class = getDefinitionByName("MenuScreen") as Class;
        //addChild(new menuScreen() as DisplayObject);
    }
}

它附加的Preloader

public class Preloader extends MovieClip
{
    public function Preloader()
    {
        addEventListener(Event.ENTER_FRAME,Load);
    }
    private function Load(e:Event):void
    {
        //"bar" is a movieclip inside the preloader object
        bar.scaleX = loaderInfo.bytesLoaded/loaderInfo.bytesTotal;
        //"percent" is a dynamic text inside the preloader object
        percent.text = Math.floor(loaderInfo.bytesLoaded/loaderInfo.bytesTotal*100)+"%";
        trace(loaderInfo.bytesLoaded+" / "+loaderInfo.bytesTotal);
        if (loaderInfo.bytesLoaded == loaderInfo.bytesTotal)
        {
            removeEventListener(Event.ENTER_FRAME,Load);
        }
    }
}

- >除了Export on Frame 1

之外,没有任何内容设置为Preloader

- >第一帧上没有对象;第一帧上唯一的代码是stop();

- >我在第二帧中放置了每个MovieClip的副本,当点击startButton时,运行gotoAndStop(3);,所以没有人看到第2帧。

如果有人知道我可以忘记的任何简单,请告诉我!

谢谢!

3 个答案:

答案 0 :(得分:1)

您想在预装的文件中使用预加载器。在这种情况下,项目的其余部分代码和资产将会膨胀。您看到预加载器似乎被延迟的原因是因为swf必须在任何代码执行之前完全加载。这包括舞台上的所有资源,无论它们在哪个框架上,即使您有适当的设置导出除第1帧之外的其他内容。相反,请尝试使用空白shell作为预加载器。这个shell中没有任何内容,只有加载器代码和预加载器图形或动画。加载完成后,隐藏预加载器并将加载的内容添加到shell的舞台或shell中的容器动画片段。

以下所有代码都在你的shell中,这只是另一个FLA文件,其中没有任何内容,但此代码和预加载器栏。此文件的尺寸应与您加载到其中的文件相同,即您尝试预加载的原始swf文件。

通过调用 loadSwf(" mySwfNameOrURLToSwf.swf")来使用它; 变量 _percent 将填充当前的加载百分比,您可以将其与加载条比例对应。假设预加载条名为" bar",onSwfLoaded函数中的 bar.visible = false; 行将隐藏它。 addChild(_swf)将加载的swf添加到shell的阶段。 _swf.init(); 行引用了一个函数,你需要添加一个名为 init()的加载swf,它启动你加载的swf做它应该做的任何事情做。让加载的swf中的所有内容现在都在第一帧开始,包括 init()函数。

import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Bitmap;

import flash.net.URLRequest;

import flash.system.ApplicationDomain;
import flash.system.SecurityDomain;
import flash.system.LoaderContext;
import flash.system.Security;

import flash.events.Event;
import flash.events.ProgressEvent;

var _swfLoader:Loader;
var _swf:DisplayObject;
var _percent:Number;

function loadSwf( swfURL:String ):void
{
    _swfLoader = new Loader();
    var req:URLRequest = new URLRequest( swfURL );

    var loaderContext:LoaderContext = new LoaderContext();
    loaderContext.applicationDomain = ApplicationDomain.currentDomain;
    loaderContext.checkPolicyFile = true;

    _swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onSwfProgress);
    _swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfLoaded);

    _swfLoader.load(req, loaderContext);
}

function onSwfProgress( evt:Event ):void
{
    _percent = Math.round( ( evt.target.bytesLoaded / evt.target.bytesTotal ) * 100 );
}

function onSwfLoaded( evt:Event ):void
{
    _swfLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onSwfProgress);
    _swfLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onSwfLoaded);

    _swf = _swfLoader.content;

    addChild( _swf );
    bar.visible = false;
    _swf.init();

    _swfLoader = null;
}

答案 1 :(得分:0)

你的代码看起来不错。 如果您不在http服务器上,则会模拟加载过程。

编译完成后,按crtl + B. 在菜单中,您可以选择下载速度并再次按ctrl + enter来模拟下载。

它可能会帮助您调试预加载器

答案 2 :(得分:0)

@Lee Burrows你所说的是对的,如果你看一下我在代码末尾提到的内容(三个大胆点)会更好

我使用的解决方案是: - >我在3帧文档上将所有内容设置为Export on Frame 2。 - >删除第2帧上的所有内容 - >创建了一个TextField via构造函数,并使用drawRectangle加载栏 - >第1帧没有动画片段,并且已使用

var menuScreen:Class = getDefinitionByName("MenuScreen") as Class;
addChild(new menuScreen() as DisplayObject);

而不是之前的代码。

我原来无法正常工作的原因是,正如Lee Burrows提到的那样Export for Actionscript会挂起X = 1 Export on Frame X中的加载,无论Export on Frame 1是否Export for Actionscript 1}}是否被检查过。将它更改为2或取消选中{{1}}是两个解决方案(除非它没有为actionscript导出,否则它的代码不能被引用)。

Preloader现在开始时约为2%。