加载多个SWF文件的解决方案

加载多个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方法直接调用了.

备注:
[附例子] 下面贴出主要源代码
也许有更好的解决问题的方法,请大家拍砖
  1. package
  2. {      import flash.utils.getQualifiedClassName();
  3.         import flash.display.Loader;
  4.         import flash.display.LoaderInfo;
  5.         import flash.display.MovieClip;
  6.         import flash.events.Event;
  7.         import flash.utils.ByteArray;
  8.        
  9.         /**
  10.          * @author oHuangKeo 2009-09-28 12:05
  11.          */
  12.         public class B extends MovieClip
  13.         {
  14.                 // 预加载SWF数量
  15.                 private var allClassNum:uint = 2;
  16.                 // SWF A文件
  17.                 [Embed(source = "A.swf")] private var AClass:Class;
  18.                 // SWF B文件
  19.                 [Embed(source = "AA.swf")] private var AAClass:Class;
  20.                
  21.                 // 申请加载数组
  22.                 // 定义为数组是因为可能要加载的SWF数据可能会N多个,要是一个一个写,代码量会比较大
  23.                 // 所以定义为数组直接操作数组比较好
  24.                 private var LoadMovieClip:* = {
  25.                         "A": { Class:AClass, MC:new MovieClip() },
  26.                         "AA": { Class:AAClass, MC:new MovieClip() }
  27.                         /*
  28.                         ...
  29.                         这里可能还有更多的加载SWF
  30.                          */
  31.                 }
  32.                
  33.                 /**
  34.                  * 大家都知道这个是干啥的
  35.                  */
  36.                 public function B()
  37.                 {
  38.                         if (stage) init();
  39.                         else addEventListener(Event.ADDED_TO_STAGE, init);
  40.                 }
  41.                
  42.                 /**
  43.                  * 初始化
  44.                  * 处理预加载SWF数组
  45.                  * @param        e
  46.                  */
  47.                 private function init(e:Event=null):void
  48.                 {
  49.                         for each(var i:* in LoadMovieClip)
  50.                         {
  51.                                 var loader:Loader = new Loader();
  52.                                 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
  53.                                 loader.loadBytes((new i.Class()).movieClipData);
  54.                         }
  55.                 }
  56.                 /**
  57.                  * 某个数据加载完成事件
  58.                  * @param        e
  59.                  */
  60.                 private function loadComplete(e:Event):void
  61.                 {
  62.                         var content:MovieClip = e.currentTarget.content;
  63.                        
  64.                         // 分析是哪个Class
  65.                         // 这个方法可能有点笨,但目前我还不知道如果得到类名
  66.                         // 需要得到类名为 A, 而不是[class A]
  67.                         //var className:String = content.constructor.toString();
  68.                        // var parseName = //[class (.+)/]/.exec(className);                          
                          //获取类名的文件已找到更好的方法:
    flash.utils.getQualifiedClassName(content.constructor);
  69.                         // 保存MovieClip对象
  70.                         LoadMovieClip[parseName[1]].MC = content;
  71.                        
  72.                         // 如果需要要加载的SWF都加载完成,就开始其它事了
  73.                         if (--allClassNum == 0) start();
  74.                 }
  75.                
  76.                 private function start():void
  77.                 {
  78.                         // 添加A文件到舞台
  79.                         addChild(LoadMovieClip["A"].MC);
  80.                         // 调用A文件的afun方法
  81.                         LoadMovieClip["A"].MC.afun();
  82.                         // 添加AA文件到舞台
  83.                         addChild(LoadMovieClip["AA"].MC);
  84.                 }
  85.         }
  86.        
  87. }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值