Laan's steps..

Feed Rss

as3 as2数据共享

03.08.2011, flash, by .

的时候,我们使用as3的swf文件加载as2的swf文件,同时还需要告诉as2的swf一些数据。蛋疼下~~
最传统的办法就是使用localconnection了。不过很杯具的是,你得让两个swf文件约定一个连接名。好了,这样的话,你的swf如果被运行多份怎么办?那就随机一个连接名嘛——还是回到问题本身了:怎么把这个连接名在as3和as2中共享。

这里只分享下简单数据的共享,比如一个随机数字。有了这个随机数字,as2和as3就能确定一个连接名,比如_laan_123456,建立LocalConnection连接,就解决共享复杂数据的需求了。

1.最简单的方式请使用这个类库>>,如下使用:

//在as3 swf中,将数据分享给avm1
laan.smart.as2.ShareDataToAS2.shareData(“keyName”, “value”);
//两个都是字符串类型。有了json,复杂数据类型也就不是问题了。

//在as2文件中,如下获取数据
var value:String = this["keyName"];

这种方法最简单了,而且结合json也能解决复杂数据的共享需求。不过千万要注意跨域。就是说如果as3和as2文件不在同一域下,是无法分享数据的。如果跨域了,建议你使用loader.loadBytes来加载as2文件。这样就完全没问题了。

2.使用url传递参数:

//在as2加载地址
var as2URL:String = "http://www.laan.so/a.swf";

//添加参数
as2URL += "?data=1234567";

loader.loader(new URLRequest(as2URL));

这种方式的缺点就是由于data的不一样,导致无法使用浏览器的缓存数据。特别是as2文件比较大时,很浪费带宽,也很考验用户耐心。当然,大量数据也是有问题的。

3.使用一些属性传递数据。因为as2加载到as3中后,就是一个AVM1Movie对象了。这样你就可以通过设置AVM1Movie的数据来传递数据了。比如opaqueBackground、alpha等等。前提是,as2和as3同一域,或者以开放域as3域了:
天地会有一个类似的帖子:http://bbs.9ria.com/viewthread.php?tid=62985&highlight=as2%2Bas3
as3代码:

//为了不影响as2的显示,alpha值保证在0.99以上。肉眼也难看出来滴~~
//0.99后面就是要携带的数据了
var lcNumber:Number = 0.99 + uint(Math.random() * 10000) / 1000000;
loader.contentLoaderInfo.alpha = lcNumber;

一定要注意Number数据类型的精度问题啊~~ 疑惑的可试试如下代码:

var n:Number = 0.991234567;
trace(n);//输出的和0.991234567可能会相差很多很多

as2代码:

var num:Number = _root._alpha;
if (num < 100) {
	var as3Data:String = String(num).substr(3, 100);
 	_root._alpha = 100;
}

目前研究到的就这几种方案了。欢迎补充…

as3 as2数据共享 有 4 条回应

  1. 2011-03-08 在 14:30 psychedelico

    记得日本有个开源类库是将avm1 swf 转载入转成 avm2

    回复
  2. 4.1+的sdk可以这样AVM1Movie(loader.content).call(“func”,param);

    回复
  3. @l4cd
    一查吓一跳。原来还有这么多未公开方法:http://bbs.blueidea.com/thread-2698806-1-1.html
    只用过addFrameScript方法~~

    学习了

    回复
  4. 吓一跳,学习了

    回复

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>