打印

[AS3] AS3自身Loading实验

本贴没有实际的原创方法,只是对已经存在的方法进行了实验。

关于AS3的自身Loading,论坛里面还是有一些方法的。
针对在Flash CS3下给出的一些方法,我做了一些实验,方法是写一个继承自MovieClip的类,与库中一个MC绑定,这个MC中还有一张200K的图片,用模拟下载28.8K测试,下面是结果。

实验1
在flashlizi的“【从AS2到AS3之三】全新的加载(Loading)机制”中,flashlizi与eidiot在自身Loading方面产生了大大的分歧。
flashlizi的方法是,把所有其他的类在第二帧或以后导出,然后这样写文档类(从原帖Copy的)
package flashrek.example{
    import flash.display.MovieClip;   
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.display.LoaderInfo;
    import flash.text.TextField;
    public class PreLoader extends MovieClip {
        var loadText:TextField=new TextField();
        public function PreLoader() {
            this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress);
            this.loaderInfo.addEventListener(Event.COMPLETE, loadComplete);
            addChild(loadText);
        }
        private function loadProgress(evt:ProgressEvent):void {
            var perLoaded:Number = evt.bytesLoaded/evt.bytesTotal;
            perLoaded = Math.round(perLoaded * 100);
            loadText.text = "Loading: "+perLoaded+"%";
            //trace("Loading: "+perLoaded+"%");
        }
        private function loadComplete(evt:Event):void {
            //trace("Complete");
            loadText.text="Complete";            
        }
    }
}
而且flashlizi实验成功了。但是,成功的关键是,他的文档类没有去调用其他的自己写的类,而第二帧的mp3也没有进行类绑定。
我的实验是,把我的MC类在第二帧导出,而且要在加载完成之后用一段代码动态创建该类的示例,那么在我的实验中,这段代码无论写在文档类中的加载成功事件之后,还是写在时间轴的第二帧上,都没有执行,甚至影响了文档类中代码的正常执行。

实验2
首先看下在“AS3自身的Loading,头大。。。”这个帖子中出现的代码:

//AS3自身Loading
此代码帧上(第一帧)不要放其他元件(否则要下载完此帧上左右内容才开始,即看不到真实loading效果了)
或者单独用一个场景来做Loading(推荐)

var mytext:TextField = new TextField();
mytext.autoSize = TextFieldAutoSize.CENTER;
mytext.selectable=false;
mytext.background = true;
var myformat:TextFormat = new TextFormat();
myformat.font = "Verdana";
myformat.size = 10;
mytext.defaultTextFormat = myformat;
addChild(mytext);

this.root.loaderInfo.addEventListener(Event.COMPLETE, loadComplete);
this.root.loaderInfo.addEventListener(ProgressEvent.PROGRESS, showProgress);
function loadComplete(event:Event):void {
removeChild(mytext);
play();
}
function showProgress(event:ProgressEvent):void {
var p:Number=event.bytesLoaded/event.bytesTotal;
var n:Number=Math.round(p*100);
mytext.text="Loading "+n.toString()+"%";
mytext.x=stage.stageWidth/2-mytext.width/2;
mytext.y=stage.stageHeight/2-mytext.height;
//trace(n);
}

基于时间轴的~同样不行。只要不在第一帧导出,就会影响所有代码的执行。
而只要在第一帧导出,那么自身Loading的代码就会失去意义。

上面的两个实验仅针对Flash CS3,而且仅仅是对论坛中给出的完整Loading代码的实验,小弟刚刚拿着一本《AS3殿堂之路》开始学,所以实验中肯定会有疏漏之处,希望各位高人批评指正。

我现在想用一个只有2~3KB的swf去load主swf,不知道行不行?这样,就算主swf有个几百KB,也可以显示出Loading的效果了吧。
一些大站都是用loader.swf去载main.swf的
LZ要仔细看看是如何自身loading的。另外,以前我给的例子中确实只是很简单,没有包含类、组件的loading。这里我再给一个例子,里面包含有图片、按钮组件、自定义类等的自身loading。这里我不做过多的解释,想研究的可以仔细看代码(除开代码关键的地方就是取消第1帧导出,并设置“导出帧中的类”为第2帧。)

另外,只要不是非得要把所有文件都做进一个swf文件,那么都建议用小的loader去装载其他swf文件。
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
多谢哈,本人比较菜,只知道照着现成的代码来……
多谢  我也碰到类识的问题,学习ING。。。

TOP

请问一下 代码里 有个super()是什么意思?还有主代码最后倒数一句
“var mainClass:Class = loaderInfo.applicationDomain.getDefinition("MainClass") as Class;”是什么意思?
谢谢

TOP

to flashlizi
你的代码看上去成功了,但是你为什么要放一个MC,把所有的东西放在MC的Frame 2,然后在Frame 1加一个Stop()呢?
如果主场景上面什么也不放,全靠加载完后执行代码动态创建,是不是不在第一帧导出还是不行呢?

TOP

也遇到这个问题啊!

同样遇到这个问题,如果不在第一帧导出就会出问题,好奇怪!

TOP