加载多个SWF文件的解决方案
转自http://blog.csdn.net/hu36978
起源: 在一个中大型的项目中,不可能把所有内容都做到一个FLASH中来制作,原因很简单,太大. 所以很多时候会有N多个FLASH小文件,然后一个主要FLASH来加载调用.这样的好处显而易见的.
问题: 1.简单的使用Loader直接加载SWF,显然会加大服务器的压力.(比如网络游戏,请求量比较大) 2.使用[Embed]可以解决此问题,但还是有个问题.就是Embed只能加载Class或String,不能是MovieClip. 所以这样加载来的Class实例化后不能控制MC里的元件或是Public方法.
解决方案: 还是使用Embed,使用loadBytes的方法加载实例化的对象二进制数据,以二进制数据实例化一个MC对象. 这样就可以对此MC里的元件或Public方法直接调用了.
备注: [附例子] 下面贴出主要源代码 也许有更好的解决问题的方法,请大家拍砖
- package
- { import flash.utils.getQualifiedClassName();
- 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);
//获取类名的文件已找到更好的方法: flash.utils.getQualifiedClassName(content.constructor); | - // 保存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);
- }
- }
-
- }
|