遮罩实现的水波效果

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AS教程:用动态遮罩实现液化效果

本例介绍运用Flash AS的动态遮罩来实现液化效果,教程详细讲解了AS代码的

运用,并给出了详细的代码解释,希望能给朋友们带来帮助~~

先看效果:将鼠标在图片上移动看看效果。

制作方法:

1. 新建flash文档,将帧频调到31.导入一张图片。

2. 新建一影片剪辑,将图片拖入。然后回到主场景,将该MC放到舞台上,居中对齐。打开属性面板实例名称设为:pic_mc.

3. 新建一影片剪辑,用椭园工具画一个无笔触任一填充的园,这个园应该

覆盖图片的大部分。

回到主场景,新建一层,将库中的园元件拖上舞台。打开属性面板,实例名

称为:mask_mc.将这一层拖到图片层的下面。

4. 新建一层,取名为action,输入下列代码:

this.createEmptyMovieClip("theScene", this.getNextHighestDepth());

var maxImages:Number = 20;

dupeAndPlace = function (image:MovieClip):Object {

var arrHolder:Object = new Object();

arrHolder.pics_arr = new Array(0);

arrHolder.masks_arr = new Array(0);

for (var i = 1; i

var dnm = "image" + i;

var mnm = "mask" + i;

var imgObj = {_x:image._x, _y:image._y, _xscale:100+(i*1.7),

_yscale:100+(i*1.7)};

var maskObj = {_xscale:Math.floor(100/i+3),

_yscale:Math.floor(100/i+3), _x:this._xmouse, _y:this._ymouse};

var theDupedImage = image.duplicateMovieClip(dnm, theScene.getDepth()+ i, imgObj);

var theDupedMask = mask_mc.duplicateMovieClip(mnm, theScene.getDepth()+(i*50), maskObj);

theDupedImage.setMask(theDupedMask);

arrHolder.pics_arr.push(theDupedImage);

arrHolder.masks_arr.push(theDupedMask);

}

mask_mc._visible = false;

return arrHolder;

};

makeWaves = function (masks_arr:Array) {

for (var i = masks_arr.length; i>0; i--) {

masks_arr._x += (this._xmouse-masks_arr._x)/maxImages*i;

masks_arr._y += (this._ymouse-masks_arr._y)/maxImages*i;

}

};

this.liquefyImage = function(theImage:MovieClip){

var arrHolder:Object = dupeAndPlace(theImage);

onEnterFrame = function(){

makeWaves(arrHolder.masks_arr);

}

}

pic_mc.onRollOver = function(){

liquefyImage(pic_mc);

}

OK,大功告成!

代码分析:

看到这个效果我们很可能想到虑镜,其实不然,这就是用遮罩实现的效果。原理并不复杂。若干个随鼠标运动的园型遮罩,下面也是若干个被遮罩的图片,遮罩和被遮罩大小都不断变化,从而实现了这个效果。

首先创建了一个空的MC,然后预设了一个数量,上面我们说到若干个,这里

设为20。

this.createEmptyMovieClip("theScene", this.getNextHighestDepth());

var maxImages:Number = 20;

接下创建一个函数用来创建这些若干个遮照和图片。

dupeAndPlace = function (image:MovieClip):Object {

创建一个对象用来存放这些遮罩和图片。

var arrHolder:Object = new Object();

接下来创建两个数组一个用来存放图片,一个用来存放遮罩:

arrHolder.pics_arr = new Array(0);

arrHolder.masks_arr = new Array(0);

接下来用一个for循环来创建这些图片和遮罩:

for (var i = 1; i

用两个变量来代表图片和遮罩,这样一个循环下来,就产生了20个图片和

遮罩,当然这时还没创建,只是产生了20个名称而已:

var dnm = "image" + i;

var mnm = "mask" + i;

接下来再创建两个对象,用来存放将要产生的遮罩和图片的属性:

var imgObj = {_x:image._x, _y:image._y, _xscale:100+(i*1.7),

_yscale:100+(i*1.7)};

var maskObj = {_xscale:Math.floor(100/i+3),

_yscale:Math.floor(100/i+3), _x:this._xmouse, _y:this._ymouse};

下面创建两个对象分别复制图片和遮罩,并将上面两个对象中存的属性赋给它们。

var theDupedImage = image.duplicateMovieClip(dnm,

theScene.getDepth()+ i, imgObj);

var theDupedMask = mask_mc.duplicateMovieClip(mnm,

theScene.getDepth()+(i*50), maskObj);

然后将遮罩应用于图片上:

theDupedImage.setMask(theDupedMask);

然后将遮罩和图片存到上面创建的数组中。

arrHolder.pics_arr.push(theDupedImage);

arrHolder.masks_arr.push(theDupedMask);

将舞台上的mask_mc元件隐藏。

mask_mc._visible = false;

返回存放这些遮罩和图片的对象:

return arrHolder;

上面这些动作都是在for循环中,因此,到现在就已创建了20对大小不一遮罩和图片,并且都被设置了遮罩和被遮罩的关系。

下面创建一个函数使这些遮罩向鼠标靠近:

相关文档
最新文档