回去研究下AS2
前两天做设计师的同事给客户做一个过渡动画,大家都知道,我们一般为了节省时间,经常会去找一些现成的特效反编译一下再作修改。
改了几次,客户也基本满意了,但又提了个要求:能不能在上面加一个产品图片循环滚动的效果?而且这些图片后期可以修改的。
这可难住我那个同事了,要动态加载图片,就要用到脚本,于是找我来帮忙。
我一看,那个flash版本很旧了,发布设置是6.0+as1,本来想改成as3重写,但是一看里面有些其它效果用了脚本,比如LOGO出现时遮罩上面用了个类似雪花飘动的效果,这一改,就麻烦了。于是只好硬着头皮去研究下AS2。
首先是图片加载,按最简单的图片滚动功能(也不考虑什么性能之类的了),把传入的图片加载两遍,依次排开,父MC做了个遮罩,再对父MC做onEnterFrame减小_x,到一定程度再重新定位回来。
第一个图片加载就遇到问题了,按手册上,有两种方法加载图片,一种是直接创建空MC,调用MC.loadMovie,可以加载动画,gif,png,jpg动画,但是不能监听加载进度。另一种是用MovieClipLoader来加载,这种可以监听整个加载过程。按简单的,直接依次创建MC,调用loadMovie依次加载图片。但是奇怪的是只出一张图片,就是最后一张。找了半天找不到问题。换MovieClipLoader类,死活看不见图片。唉,搞这些过时的东西,真是费神。于是看下是不是发布版本的问题,把发布版本调成8.0+as2,输出看看,图片是加载了,还是一张,这就说明是6.0不支持MovieClipLoader这个东西,但是又没有错误提示。
调完之后,发现一个问题,就是logo出现那一段动画雪花的效果变难看了,放个示例做对比吧(为了方便,我就不放完整的动画了,只放上雪花的):
这个是ok的:
这个是将发布版本从6.0调成8.0之后的:
里面代码也不多,大致看了下,似乎没什么问题,难道是有些影片的特效不起作用了?因为这个雪花内嵌了几层元素,动画的时候复制自身实现的效果。看了下动画的设置上,也没什么,于是又回去研究代码,由于是反编译回来的代码,变量都比较纠结。其实整段基本上就一个for循环。
_root.star._visible = 0; //这一句莫名其妙 _root; star.onEnterFrame = function () { var _loc2 = this; for (var _loc1 = 0; _loc1 < 5; ++_loc1) { mc = _loc2.duplicateMovieClip("star" + i, i); mc._rotation = random(360); mc._alpha = random(100) + 50; mc._xscale = mc._yscale = random(30) + 30; //for循环体用了_loc1,这里怎么用i ? ++i; } // end of for };对了,那个i是没声明的,于是trace了下。发布版本设置为6.0时,出来的是一个递增的数字。
但发布版本一旦改到7.0或以上,出来的都是NaN,是这个问题了,猜想了下,那一句_root;应该是 i=0;被反编译时忽略了。
改完立马就正常了,长出了一口气,下面再搞图片加载的问题。
按道理说,MC之间是互不影响的,为什么循环里加载,就变成了只加载最后一张,而且加载到了第一个MC里?
还是互相之间影响到了?
于是改复杂点,监听下载进度,第一张下载完才下载第二张。试了下,果然ok了。
this.createEmptyMovieClip("mPicContainer1",this.getNextHighestDepth()); this.createEmptyMovieClip("mPicContainer2",this.getNextHighestDepth()); this.createEmptyMovieClip("mPicContainer3",this.getNextHighestDepth()); this.createEmptyMovieClip("mPicContainer4",this.getNextHighestDepth()); //在需要的地方创建一个用来装载图片的空mc var oListener:Object = new Object(); //创建一个侦听器 var mcLoader:MovieClipLoader = new MovieClipLoader(); oListener.onLoadError = function():Void{ //如果加载出现问题时要执行的操作 } oListener.onLoadStart = function():Void{ //加载开始时要执行的操作 } oListener.onLoadProgress = function(target:MovieClip,bytesLoaded:Number, bytesTotal:Number):Void{ trace(bytesLoaded+"/"+bytesTotal); //加载进行中要执行的操作 } oListener.onLoadComplete = function():Void{ //加载完成时要执行的操作 } oListener.onLoadInit = function(c):Void{ //加载对象初始化完毕时执行的操作 //比如调整图像大小、位置等 c._width=100; c._height=150; if(loadindex>4){ mcLoader.removeListener(oListener); }else{ loadnext(); } } mcLoader.addListener(oListener); var loadindex:Number=1; loadnext(); function loadnext(){ mcLoader.loadClip(loadindex+".jpg",this['mPicContainer'+loadindex]); this['mPicContainer'+loadindex]._x = loadindex * 110; loadindex++; }下面再处理下图片进入方式,使用mx.Transition里面的效果,功能大致就实现了。
总结一句话:纠结的AS2!