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

备注:
[附例子] 下面贴出主要源代码
也许有更好的解决问题的方法,请大家拍砖[code]
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);
}
}

}
[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值