转自:http://www.itfeed.cn/post.asp?id=10197
其实这里简洁的说法应该是AVM2加载AVM1的swf。
actionscript1.0(flash 1.0-6.0)对应的虚拟机AVM1,基于ECMA-262 V2(相当于javascript1.2)
actionscript2.0(flash 7.0-8.0)对应的虚拟机AVM1,基于ECMA-262 V3(相当于javascript1.5)
actionscript3.0(flash9.0--)对应的虚拟机AVM2,基于ECMA-262 V4
网上已经有许许多多的as2或as1写的flash小游戏了,要改这些游戏其它而言比重新写一个要快很多。去年差不多二个月左右的时候在专门改flash的小游戏,那个时候改还是简单的改动,不需要改动里面的一些资源,只需要找到点击游戏开始时及游戏结束时的事件和游戏的分数。具体的改动如下:
1、用户点击游戏开始的时候flash 回调一下js,JS作出相应的处理,如发一个请求告诉后台,嗯,这位用户已经玩过这个游戏了,界面上的提示要改一下了。
2、用户玩游戏结束后,需要将分数返回给js然后JS通过ajax将分数传给后台,当然这中间也可以像白社会一样直接在flash代码里写死,不过其它网页也需要得到那个分数然后与当前用户的好友的分数进行比较(不需要再从服务器请求此游戏的好友数据,进入页面时已经请求过一次了,需要操作内存的那个数据然后再重新渲染至页面)。
3、游戏重新开始的处理(这个有两种方案,一种是直接重新再初始化一次flash,还有一种就是每一个小flash提供重新开始游戏的方法)
说说遇到的问题(很多问题真的让人捉摸不透):
1、两个用flash as3写的swf,可以通过设置wmode="transparent"实现两个flash相互穿透的效果,可见的部分就可以穿透,而flex写的无法实现。?!!!但是可以通过设置底部SWF的wmode="opaque",上层transparent解决,但同时也会产生SWF里面会产生比较严重的延时。
2、FF下使用网页的DIV/iframe,通过绝对定位定位于flex写的swf区域时,DIV的内容不停的抖动。(在未设置SWF为透明的情况下),而且还会出现当SWF获得焦点时,DIV或是iframe就消失了。但如果你设置透明的话,那么主swf(as3.0)渲染和操作将会大大折扣。
3、as2.0/as1.0编写的stopAllSounds()居然也可以让as3.0编写的主swf声音全部关闭
4、as2.0/as1.0中通过new Sound是可以播放声音,但主swf (as3.0)加载它以后却无法播放声音,必须通过创建一个MC,然后new Sound(mcObj),然后返回一个变量后通过attachSound 可以播放声音,但是如果用createEmptyMovieClip的时候第二个参数指定这个MC的“深度”时,这个值尽可能大一点,但少不能让其它创建的MC把它给盖住了,不然也是没有声音的(这个我至少调了三个小时以上找到游戏第二关出现没有声音的问题,血的教训!)
5、即使在as3.0编写的SWF在游戏结束后移除as2.0/as1.0编写的SWF,也不能保证SWF不会再执行。而as2.0或as1.0中的onEnterFrame是极其消耗资源的,和此SWF的帧率有关。(也就是一次要调多少次这个函数)
6、默认加载as3.0中加载as2.0或as1.0的SWF,其帧率为当前as3.0的帧率,但是可以设置,可是当游戏结束时不一定能再设置回来,这个很玄
7、lockroot=true根本不起作用,而且会对加载它的容器as3.0产生一些影响
as3.0与as2.0/as1.0编写的SWF之间通讯也是一件很痛苦的事情,之前一直在尝试,后来完全放弃了。问题太多太多,简直可以让人崩溃。虽然有本地通讯localConnection等许多办法解决通讯的问题,但其实最重要的问题是采用这种机制进行加载BUG随时存在,但你又无能为力。