有的时候,我们使用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.laaan.cn/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; }
目前研究到的就这几种方案了。欢迎补充…