当前位置: 代码迷 >> Web前端 >> 加载多个SWF资料的解决方案
  详细解决方案

加载多个SWF资料的解决方案

热度:74   发布时间:2012-10-24 14:15:58.0
加载多个SWF文件的解决方案
[i=s] 本帖最后由 ohuangkeo 于 2009-9-28 13:06 编辑 [/i]

起源:
在一个中大型的项目中,不可能把所有内容都做到一个FLASH中来制作,原因很简单,太大.
所以很多时候会有N多个FLASH小文件,然后一个主要FLASH来加载调用.这样的好处显而易见的.

问题:
1.简单的使用Loader直接加载SWF,显然会加大服务器的压力.(比如网络游戏,请求量比较大)
2.使用[Embed]可以解决此问题,但还是有个问题.就是Embed只能加载Class或String,不能是MovieClip.
  所以这样加载来的Class实例化后不能控制MC里的元件或是Public方法.

解决方案:
还是使用Embed,使用loadBytes的方法加载实例化的对象二进制数据,以二进制数据实例化一个MC对象.
这样就可以对此MC里的元件或Public方法直接调用了.

备注:
[附例子] 下面贴出主要源代码
也许有更好的解决问题的方法,请大家拍砖
package 
{
        import flash.display.Loader;
        import flash.display.LoaderInfo;
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.utils.ByteArray;
        
        /**
         * @author oHuangKeo 2009-09-28 12:05
         */
        public class B extends MovieClip
        {
                // 预加载SWF数量
                private var allClassNum:uint = 2;
                // SWF A文件
                [Embed(source = "A.swf")] private var AClass:Class;
                // SWF B文件
                [Embed(source = "AA.swf")] private var AAClass:Class;
                
                // 申请加载数组
                // 定义为数组是因为可能要加载的SWF数据可能会N多个,要是一个一个写,代码量会比较大
                // 所以定义为数组直接操作数组比较好
                private var LoadMovieClip:* = {
                        "A": { Class:AClass, MC:new MovieClip() },
                        "AA": { Class:AAClass, MC:new MovieClip() }
                        /*
                        ...
                        这里可能还有更多的加载SWF
                         */
                }
                
                /**
                 * 大家都知道这个是干啥的
                 */
                public function B()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                
                /**
                 * 初始化
                 * 处理预加载SWF数组
                 * @param        e
                 */
                private function init(e:Event=null):void
                {
                        for each(var i:* in LoadMovieClip)
                        {
                                var loader:Loader = new Loader();
                                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
                                loader.loadBytes((new i.Class()).movieClipData);
                        }
                }
                /**
                 * 某个数据加载完成事件
                 * @param        e
                 */
                private function loadComplete(e:Event):void
                {
                        var content:MovieClip = e.currentTarget.content;
                        
                        // 分析是哪个Class
                        // 这个方法可能有点笨,但目前我还不知道如果得到类名
                        // 需要得到类名为 A, 而不是[class A]
                        var className:String = content.constructor.toString();
                        var parseName = /\[class (.+)\]/.exec(className);
                        
                        // 保存MovieClip对象
                        LoadMovieClip[parseName[1]].MC = content;
                        
                        // 如果需要要加载的SWF都加载完成,就开始其它事了
                        if (--allClassNum == 0) start();
                }
                
                private function start():void
                {
                        // 添加A文件到舞台
                        addChild(LoadMovieClip["A"].MC);
                        // 调用A文件的afun方法
                        LoadMovieClip["A"].MC.afun();
                        // 添加AA文件到舞台
                        addChild(LoadMovieClip["AA"].MC);
                }
        }
        
}
  相关解决方案