[转]Flash获取自身swf加载进度的三种方法

http://www.eb163.com/club/thread-16229-1-1.html

让用户面对苍白的屏幕几十秒,那也一件非常可怕的事情。所以一个好的flash作品(游戏也好,动画好罢),都需要一个好的开头!而这个好的开头就是Loading。可能刚开始学习的时候,cookbook会告诉你,使用Loader对象加载外部swf时,可以监听整个加载的进度。那我们再深入的问一问,如果要获取swf自身的加载进度,又该如何操作呢?

听说之前用as2代码的时候(仅听说),很容易就能实现swf自身的loading。但在as3中,相对有些复杂。那么as3中怎么实现呢?纠结了几天,问了论坛里的一些高手(主要是iicam),查了较多的资料,终于把这个问题搞清楚了。现在帖出来,和各位初学者分享一下。




当然,高手路过,还请多多批评指正。




现在回到正文,如何获取加载进度。

知识点:LoaderInfo类

这个是帮助文档中的解释:LoaderInfo 类可提供有关已加载的SWF 文件或图像文件(JPEG、GIF 或 PNG)的信息。 LoaderInfo 对象可用于任何显示对象。提供的信息包括加载进度、加载程序的 URL 和加载内容、媒体的字节总数以及媒体的标示的高度和宽度。

有2种方式可以访问LoaderInfo对象:
1)访问flash.display.Loader对象的contentLoaderInfo属性;
2)任何一个可显示对象(displayobject)都有loaderInfo属性;

注意:每个SWF文档的主类的实例有loaderInfo属性,每个Loader有loaderInfo属性,同时它有一个contentLoaderInfo属性,通过这个属性你可以访问到Loaded对象的loaderInfo。



那么如何通过这个属性获取加载进度呢?






第一种方法(不推荐)

代码如下:




01.package {

02.        import flash.display.MovieClip;

03.        import flash.events.*;

04.        import flash.text.*;

05.        public class loader extends MovieClip {

06.                var txt=new TextField();///建立一个TextField实例

07.                public function loader() {

08.                        addChild(txt);/////////将TextField实例推到舞台

09.                        loaderInfo.addEventListener(ProgressEvent.PROGRESS,progressHandler);///当进度变化时更新TextField实例的text属性

10.                        loaderInfo.addEventListener(Event.COMPLETE,completeHandler);///////////当载入完成后显示内容

11.                }

12.                function progressHandler(e:ProgressEvent) {

13.                        txt.text=e.bytesLoaded*100/e.bytesTotal;

14.                        trace(txt.text);

15.                }

16.                function completeHandler(e:Event) {

17.                        //removeChild(txt);//////////////载入完成后移除进度显示文本

18.                }

19.        }

20.}
复制代码





说明:此方法可能是初学者常见的一个错误。使用此方法,进度数据一出现,就直接到了100%。

有资料说,代码分离项目主时间轴通常只有一帧,而flash会默认在第一帧导出类,并在此之后调用文档类的构造函数,也就是说progress事件的侦听是在加载完成后才起作用,当然看不到进度了!

所以才有了下面两种办法






第二种方法:双文件法(即加壳)

双文件方法,就是使用一个loader.swf加载一个main.swf(主swf文件)。通过这个加载过程来获取main.swf的加载进度。

具体方法:

1、在loader.as中

n new一个Loader实例 loader,并用load方法载入main.swf

n 在 loader.contentLoaderInfo上添加progress和complete侦听

n 在progress处理函数中更新textField,并在complete处理函数将loader.content添加到舞台



2、在main.as中

l 构建舞台内容




第三种方法:双帧法

1、建立loader.as,再建立fla文件,保证主时轴有两帧且都为关键帧(一般都是空白关键帧)

2、在fla中:

l 建立一个空mc,将此mc拖到主场景的第二帧。(注:mc的名称无所谓,可以随便取)

l 这个空mc也设置为二帧关键帧。

l 将库元件中,所以链接类属性中的“在第1帧导出”前面的勾去掉

l 再将库元件中所有的链接类拖入空mc的第二帧

3、在loader.as中


建立textField并推入舞台, 构造函数中为loaderInfo添加progress和complete侦听

在progress处理函数中更新textField,并在complete处理函数中再添加enter_frame侦听

在enter_frame处理函数中构建舞台内容,并移除enter_frame侦听,也就是说让enter_frame处理函数执行一次就可以了




你可能感兴趣的:(thread,游戏,Flash)