分享
 
 
 

Flash动态遮罩高级教程

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

首先我们需要先了解一下curveTo的相关命令:

CURVETO命令:

在下面的例子中我们要用到的命令如下:

代码:

MovieClip.beginFill()

MovieClip.endFill()

MovieClip.lineTo()

MovieClip.curveTo()

前面三行我们已在第一篇教程学习过,现在只剩下curveTo,curveTo(controlX,controlY,endX,endY)将从startX,startY开始绘制一条二次方曲线至endX,endY, startX,startY的位置决定于使用moveTo,lineTo,或curveTo得到的最后一点,controlX,controlY 控制着两点之间的曲度,你可以把controlX,controlY认为是一个磁性点,它会吸附曲线靠近它。它的工作过程有些象BEZIER贝赛尔曲线,不同的是每一条曲线只有只能有一个控制点。

现在需要看一下我们的动态遮罩的工作过程,它要经过三个边续的过程,如下图所示:

如上图你所看到,遮罩的组成是由最初上面的一条直线然后变形成为4边的形状也就是面的蓝色线条将屏幕划分为4边,然后再变形为红色的线条,最后形成整个矩形。十字代表的是控制点的大致位置。

在这里面你需要注要注意的是第一条和最后一条并不是曲线,而是直线,所以你可将你的按制点放在任何地方,这也给我们增加了许多弹性空间。在后面你将会看到。

变形形体

我们必须要掌握将一个形体变为另一个形体,比如蓝色形状变为红色形状,这个看起来比较麻烦,实际上很简单,就象一个物体从A点移到B点是一个性质。我们将移到第一条曲线的三个点至第二条曲线三个点的位置,下面我们来看一下例子,将曲线c变形为曲线J。

代码:

//Create movie clip and mask

//counter = -1;

//创建遮罩

_root.createEmptyMovieClip('line', 0);

animInt = setInterval(doAnim, 17);

animDir = 1;//用来控制方向的变量

//定义函数

function doAnim()

{

var currMC = _root.line;

var time = animIndex/60;

var dist = time;

with(currMC)

{

//c曲线的位置: (150, 25), (25,100), (150,175)

//j曲给的位置: (150, 25), (125,200), (50,125)

clear();

lineStyle(0x000000);

moveTo(150,25);

curveTo(25+100*dist,100+100*dist,150-100*dist, 175-50*dist);

}

animIndex += animDir;

if(animIndex >= 60)

{

animDir = -1

}

if(animIndex <= 0)

{

animDir = 1

}

}

这段代码中是将c曲(150,25)(25,200),(150,175)变形为J曲线(150, 25), (125,200), (50,125)

注意,这段代码只能在FLASHMX中运行。如果想在FLASHMX2004中运行,你需要在定义一下animIndex在animDir=1;下面加入一行var animIndex=0;测试你的影片,观看结果。

观看演示1

开始时创建一个影片剪加line,在line的内部绘制变形曲线,setInterval每17豪秒循环绘制一次,变量animIndex用来跟踪曲线绘制到的位置,这个例子中我们分成了60步来绘制,time变量的范围是从0到1,决定于animIndex,同时将其附给dist,用来创建现线动画。

即然dist的变量范围是从0到1,那么很明显我们用到了一个公式从A点到B点

代码:

x = startX + dist*deltaX;

y = startY + dist*deltaY;

如下我们的应用:

curveTo(25+100*dist,100+100*dist,150-100*dist, 175-50*dist);

在这个公式中startX和startY是开始点的坐标,deltaX和deltaY分别是x和y到开始点和结束点的距离。

Easing, bouncing and other transitions

缓动,弹性和其它运动方式

可能在一开始你就会想我们为什么会不厌其烦的使用变量time和dist,那么现在让我们来看一下他们之间的关系,你就会知道我们为什么要用它。

如上果你所看到的竖轴代表Dist,水平轴代表time.他们之间的关系目前是线性,也是就dist=time.图上的斜线代表动画的速度。在这个例子中动画的速度是恒定的。现在假如我们想做成开始时速度很快到结速时无速度,则我们只需要在在t=0时加大红线的斜率,而在t=1时使红线无斜率就可以了。这实际上就是倒转过的抛物线或是三角正弦,如果想用其它的运动方式我们可以创建不同的dist和time的关系,来得到更有趣的效果,下面是一些创建好的关系,可能对你会有用处:

你可能会对Robert Penner's transition classes感兴趣。原理都是一样的。

将代码合在一起

代码:

//全局变量决定于你的影片宽度

mWidth = 400;

//创建影片剪辑和遮罩

counter = -1;

createMovieClip();

animInt = setInterval(doAnim, 17);

function createMovieClip()

{

counter++;

attachMovie('pic' add (counter % 2), 'pic' add counter, counter);

createEmptyMovieClip('mask' add counter, counter + 10000);

this['pic' add counter].setMask(this['mask' add counter]);

}

function doAnim()

{

var currMC = _root['mask' add counter];

if(animIndex < 15)

{

var time = animIndex/15;

var dist = 0.5*Math.sin(Math.Pi*(time-0.5)) + 0.5;

with(currMC)

{

clear();

beginFill(0x000000);

lineTo(mWidth,0);

lineTo(mWidth,dist*125);

curveTo(250,dist*40,0,10*dist);

endFill();

}

}

else if (animIndex < 35)

{

var time = (animIndex-15)/20;

var dist = 0.5*Math.sin(Math.Pi*(time-0.5)) + 0.5;

with(currMC)

{

clear();

beginFill(0x000000);

lineTo(mWidth,0);

lineTo(mWidth,125);

curveTo(250-100*dist,40+150*dist,0,10+190*dist);

endFill();

}

}

else if (animIndex <= 50)

{

var time = (animIndex-35)/15;

var dist = 0.5*Math.sin(Math.Pi*(time-0.5)) + 0.5;

with(currMC)

{

clear();

beginFill(0x000000);

lineTo(mWidth,0);

lineTo(mWidth,125+75*dist);

curveTo(150,190+10*dist,0,200);

endFill();

}

}

animIndex++;

if(animIndex > 50)

{

animIndex = 0;

_root['pic' add (counter - 1)].removeMovieClip();

_root['mask' add (counter - 1)].removeMovieClip();

createMovieClip();

}

}

这段代码使用了两个函数,createmovieclip用来将图片贴加到场景中并设置MASK,cunter用来跟踪图片的实例名称。

Doanim函数被每20豪秒调用一次,整个遮罩形成过程与范例上一个例子一样分成三部执行。对于缓动方式你可选择其它的方式,只需要将DIST的值改为其它的公式就可以。

观看演示2

总结:在这两篇教程中我们先后学习了基本的动态遮罩,和动态绘制曲线来形成遮罩,两者基本的原理相同,尤其你应注意的是如何加入easing,bouncing等等。我想这对你可能是有用的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有