主题:  如何只用一个load方法调用多个swf

哈哈儿

职务:普通成员
等级:1
金币:0.0
发贴:43
注册:2001/1/18 9:47:19
#12006/8/16 16:56:00
请问可不可以在主场景main中做一个load侦听,在load不同得swf,比如1.swf和2.swf得时候都会侦听和下载得进度.这样就不用在1.swf和2.swf都做load得action了,这样可以提高效率!
希望高手们能帮忙解决,最好能做个源文件给小弟看看.谢谢了



captainrays

职务:版主
等级:1
金币:3.0
发贴:48
注册:2005/3/12 23:49:48
#22006/8/23 18:08:51
这个。。我很久以前做了一个,还行,只有一个问题,那就是,调用一个函数同时读取n个swf的时候,这n个swf开时读取的时间是不同的,这个是没办法的,程序执行以及网络数据流总有先来后到。比如,大小为20k的1.swf最先开始读去,读了一半的时候,开始读取大小为20k的2.swf,这时候进度百分比会由50%变为25%,因为要读取的总量突然增加了。这时候如果用进度条来表示,会发现进度条往回退。。如果要计算读取的进度,就要在所有swf都开始读之后再开始计算。就是说肯定会发现这样的情况,进度条开始一段时间显示为0,若干时间后突然变为一个随机的百分数。好在经过测试,这并不影响执行。

附上as,实例化这个类就会开始读取,参数一是要读取的swf路径列表,参数二是要读去到的mc路径

class loadObject extends Object {
    var bytesLastFrame:Number
    //上一帧读取的字节数
    var totalLastFrame:Number
    //上一帧的总字节数
    var loadMc:Array;
    //影片读取器
    var mcListener:Array;
    //监听器
    var num:Number;
    //需要读取的影片数量
    var bytesloaded:Number;
    //已读取字节数
    var bytestotal:Number;
    //字节总数
    var IntProgress:Number;
    //进度
    var obj;
    var a;
    var loadStart;
    //读取开始标志位
    var loadOver;
    //读取结束标志位
    var Destroy:Function;
    function loadObject(mcArray:Array, parent) {
        num = mcArray.length;
        IntProgress = 0;
        a =0;
        bytesloaded=0;
        bytestotal=0.01;
        mcListener = new Array();
        loadMc = new Array();
        loadStart = num-1;
        loadOver = num-1;
        for (var i = 0; i<int(num); i++) {
            loadMc[i] = new MovieClipLoader();
            mcListener[i] = new Object();
            mcListener[i].obj = this;
            mcListener[i].bytesLastFrame=0;
            mcListener[i].totalLastFrame=0.01
            mcListener[i].onLoadProgress = function(Target_MC, loadedBytes, totalBytes) {
                bytesLastFrame = int(loadedBytes);
                totalLastFrame = int(totalBytes);
                
                var a=0;
                var b=0.01;
                for(var j=0;j<obj.num;j++){
                    a+=int(obj.mcListener[j].bytesLastFrame)
                    b+=int(obj.mcListener[j].totalLastFrame)
                    }
                //obj.bytesloaded += Math.abs(int(loadedBytes)-int(bytesLastFrame));
                //obj.bytestotal += Math.abs(int(totalBytes)-int(totalLastFrame));
                obj.IntProgress = Math.ceil(a/b*100);
                
            };
            mcListener[i].onLoadComplete = function(Target_MC) {
                obj.loadOver--;
                if (obj.loadOver == -1) {
                    _root.objCore.objMessageMap.SendMessage("LOAD_OVER", _root);
                }
            };
            mcListener[i].onLoadStart = function(Target_MC) {
                obj.loadStart--;
                if (obj.loadStart == -1) {
                    _root.objCore.objMessageMap.SendMessage("LOAD_START", _root);
                }
            };
            loadMc[i].addListener(mcListener[i]);
        }
        for (var i = 0; i<int(num); i++) {
            loadMc[i].loadClip(mcArray[i]._name+".swf", mcArray[i]);
        }
    }
}