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