回去研究下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!