首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

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

2012-10-24 
加载多个SWF文件的解决方案[is] 本帖最后由 ohuangkeo 于 2009-9-28 13:06 编辑 [/i]起源:在一个中大型的

加载多个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);                }        }        }

热点排行