如何使用外部 swf 作为 Flash 中的预加载器

发布于 2024-10-03 15:35:44 字数 62 浏览 3 评论 0原文

我有一个项目,我想时不时地使用不同的预加载器,所以我想知道是否有办法让我的项目使用外部 swf 作为预加载器?

I have a project where I want to use different pre-loaders from time to time so I wanted to know if there was a way I could have my project use an external swf for the pre-loader ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽清梦 2024-10-10 15:35:44

绝对可以,事实上这是一种非常常见的做法。

您的外部预加载器文件只需实例化 Loader 类的实例,然后加载到您的有效负载 .swf 中。当负载加载时,您可以监听 ProgressEvent.PROGRESS 并使用它来更新某种负载栏或其他内容。它看起来像这样:

package
{
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.net.URLRequest;

    public class Preloader extends MovieClip
    {
        // this loads in your main swf
        public var loader:Loader;

        // this points to the location of your main swf
        public var request:URLRequest;

        // this holds a reference to your main swf once it's been loaded in.
        public var content:MovieClip;

        public function Preloader()
        {
            addEventListener(Event.ADDED_TO_STAGE, addedHandler);

            super();
        }

        // it's a good practice to wait for ADDED_TO_STAGE before you start doing stuff, that way you can avoid certain Null Reference Errors
        protected function addedHandler(e:Event):void {
            removeEventListener(Event.ADDED_TO_STAGE, addedHandler);

            loader = new Loader();
            request = new URLRequest("path/to/your/file.swf");

            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
            loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
        }

        // This will fire when your main swf is loaded in.
        protected function completeHandler(e:Event):void {
            loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);
            loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
            loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, progressHandler);

            trace("Load completed! Now we're going to add the target swf to the timeline:");

            content = MovieClip(loader.content);

            /*
             *      Additional logic can go here to remove your loadbar or etc.
             */ 

        }

        // this will fire if there's a problem with loading in the swf
        protected function errorHandler(e:IOErrorEvent):void {
            trace("Error: the path specified was incorrect. Unable to find that file. Here's the error in full:\n " + e)
        }


        // this will fire constantly while the target swf is being loaded, so you can see how much more you have to load.
        protected function progressHandler(e:ProgressEvent):void {
            var perLoaded:Number = 100* (e.bytesLoaded / e.bytesTotal)
            trace("Percent Loaded: " + perLoaded);

            /*
            *   Additional logic can go here to update your load bar, etc.
            */

        }
    }
}

Absolutely, and in fact that's a very common practice.

Your external preloader file just has to instantiate an instance of the Loader class, then load in your payload .swf. While the payload is loading in, you can listen for ProgressEvent.PROGRESS and use that to update some sort of a load bar or whatever. It would look something like this:

package
{
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.net.URLRequest;

    public class Preloader extends MovieClip
    {
        // this loads in your main swf
        public var loader:Loader;

        // this points to the location of your main swf
        public var request:URLRequest;

        // this holds a reference to your main swf once it's been loaded in.
        public var content:MovieClip;

        public function Preloader()
        {
            addEventListener(Event.ADDED_TO_STAGE, addedHandler);

            super();
        }

        // it's a good practice to wait for ADDED_TO_STAGE before you start doing stuff, that way you can avoid certain Null Reference Errors
        protected function addedHandler(e:Event):void {
            removeEventListener(Event.ADDED_TO_STAGE, addedHandler);

            loader = new Loader();
            request = new URLRequest("path/to/your/file.swf");

            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
            loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
        }

        // This will fire when your main swf is loaded in.
        protected function completeHandler(e:Event):void {
            loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);
            loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
            loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, progressHandler);

            trace("Load completed! Now we're going to add the target swf to the timeline:");

            content = MovieClip(loader.content);

            /*
             *      Additional logic can go here to remove your loadbar or etc.
             */ 

        }

        // this will fire if there's a problem with loading in the swf
        protected function errorHandler(e:IOErrorEvent):void {
            trace("Error: the path specified was incorrect. Unable to find that file. Here's the error in full:\n " + e)
        }


        // this will fire constantly while the target swf is being loaded, so you can see how much more you have to load.
        protected function progressHandler(e:ProgressEvent):void {
            var perLoaded:Number = 100* (e.bytesLoaded / e.bytesTotal)
            trace("Percent Loaded: " + perLoaded);

            /*
            *   Additional logic can go here to update your load bar, etc.
            */

        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文