为什么要在 Flash 中使用预加载器

Why should I use preloader in Flash

我不太了解预加载器,但我阅读了几篇文章和 Adob​​e 说明。所以我对在 Flash 应用程序中使用预加载器感到困惑。

我打算从库中调用所有 MovieClips、声音等,舞台上不会有任何内容。对于这种情况,应用预加载器是否合乎逻辑?如果是,哪种方法最合适(即使 swf 大小更小)?

如果不说明应用程序的上下文,就不可能告诉您哪种方法最好。

对于横幅和较小的 swf(<100k)等,我不应该使用任何类型的预加载器。 Flash 将自行处理加载(只是不显示可视加载器)

对于较大的 swf 游戏,我通常让一个小的 swf 加载主 swf。

    package
{

    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;

    [SWF(width="992", height="768", frameRate="30", backgroundColor="0x000000")]
    public class Preloader extends Sprite
    {
        private var percent:Number;
        private var loader:Loader;

        public function Preloader()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            var movieurl:String = loaderInfo.parameters.movieurl;

            loader = new Loader();
            loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            var loaderContext : LoaderContext = new LoaderContext(false,new ApplicationDomain(null));

            loader.load( new URLRequest("main.swf" + version),loaderContext);

        }


        private function progressHandler(event:ProgressEvent):void
        {
            percent = ((event.bytesLoaded / event.bytesTotal)*100);
            trace ("laoded": percent)

        }


        private function completeHandler(event:Event):void{
            //removeChild(progressBar);

            addChild(loader);
        }
    }
}

如果您的应用程序必须存在 1 个 swf。您可以使用预加载器 class

主要 swf class

[Frame(factoryClass="Preloader")]
[SWF(width = "950", height = "600")]
public class Main extends Sprite 
{
  // do your coding
}

预加载器 swf class

package {
    import erasmus.simulation.LoaderFC;

    import flash.display.DisplayObject;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.events.UncaughtErrorEvent;
    import flash.utils.getDefinitionByName;


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



        private function progress(e:ProgressEvent):void {

            var progress : Number = e.bytesLoaded / e.bytesTotal;
            trace ("loader progress")
        }

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

            var mainClass:Class = getDefinitionByName('Main') as Class; // class must be a string reference
            this.stage.addChild(new mainClass(this) as DisplayObject);
        }
    }
}

舞台上不会有任何内容 - 我假设您使用的是带有时间轴的 Flash IDE?

在这种情况下(实际上还有其他情况),您必须使用预加载器。有可能(即使 运行 在本地)当您尝试从库中访问某些内容时,它还没有完全加载。

在 Flash 中 IDE 预加载器可以是时间轴中的前两帧:一些进度精灵或只是跨越两帧的 TextField,第一帧什么都不做,第二帧检查 bytesLoadedbytesTotal 相比,如果电影尚未完全加载,则转到第一帧。第三帧是所有主要代码开始的地方。

请注意,您的所有库资源都必须设置为 'export in Frame 3',即不在加载程序处于活动状态的任何帧中。

或者,您可以将单帧与基于事件的加载程序一起使用。

使用FlashDevelop时,有一个预加载器的现成项目模板。

当人们使用他们的某些库 类 或预加载器中的资产来显示漂亮的进度指示器时,这是一个常见的错误。在那种情况下,必须首先加载所有数据,预加载器不能立即工作。它看起来像空白屏幕,暂停时间长且没有预加载器,然后应用程序立即加载了 100%。所以预加载器变得毫无意义,它不能向用户显示任何进度。