Flash动态遮罩高级教程

动态|高级|教程

在上一篇教程http://www.webjx.com/htmldata/2005-03-09/1110349315.html中我有意的避开curveTo因为它相对于lineTo来说多少有些复杂,然后这种效果我认为变化多会优于一味的使用lineTo.
首先我们需要先了解一下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等等。我想这对你可能是有用的。

源文件下载:dymask2.zip

时间: 2024-10-07 21:23:21

Flash动态遮罩高级教程的相关文章

Flash 动态遮罩的原理和应用

动态 本文译者:egoldy文章出处: http://www.5etdemi.com文章性质:翻译 FLASH DRAWING API除了可以让我们绘制图形外,我们还可以应用它绘制遮罩,而这种绘制的遮罩的特点就是我们可以动态的绘制. 怎样使用FLASH DRAWING API 绘制遮罩 MM提供的遮罩的有如下这几种: 代码: MovieClip.beginFill MovieClip.beginGradientFill MovieClip.clear MovieClip.curveTo Movi

展讯NAND Flash高级教程【转】

转自:http://wenku.baidu.com/view/d236e6727fd5360cba1adb9e.html 展讯NAND Flash高级教程

Flash8 动态遮罩应用

动态 来自好友thinking的创意,需要使用可拖动的动态遮罩来模拟抹去灰尘的效果,但想让拖动的遮罩边缘更光滑,更自然一些,在flashmx2004本身实现上不太可能用直接的方法实现,兴许多用影片剪辑嵌套可以模拟出来,但用flash8是可以实现的.下面范例及代码: //***copyright by webstudio.com.cn.author by egoldy.2006.2.7 //导入flash8 filters类 import flash.filters.BlurFilter; //创

【大数据100分】CESI吴东亚:大数据标准及应用(高级教程)

[大数据100分]CESI吴东亚:大数据标准及应用[大数据高级教程] 主讲嘉宾:吴东亚 主持人:中关村大数据产业联盟 副秘书长陈新河 承办:中关村大数据产业联盟 吴东亚,中国电子技术标准化研究院信息技术研究中心标准总监.1972年生,籍贯黑龙江.1992年毕业于东南大学自动控制系毕业,1992-2001年,在中国空间技术研究院硕士学习.工作,参加"神舟一号"飞船地面测试系统研制工作,积累了一线科研和工程经验.2001-2004年,北京理工大学博士学习.2004至今,中国电子技术标准化研

DOS批处理高级教程 第一章 批处理基础_DOS/BAT

第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令统称批处理命令.小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程. 了解了大概意思后,我们正式开始学习.先看一个简单的例子! @echo off echo "欢迎来到非常BAT!" pause 把上面的3条命令保存为文件test.bat或者test.cmd然后执行,他就会在屏幕上显示以下二行话: 复制代码 代码

《Adobe Flash Professional CC经典教程》——1.13 查找关于使用Flash的资源

1.13 查找关于使用Flash的资源 Adobe Flash Professional CC经典教程为了获取关于使用Flash面板.工具及其他应用程序特性的完整的.最新的信息,请访问Adobe网站.选择"帮助">"Flash支持中心",将连接到Adobe专业帮助网站,可以在那里搜索Flash的帮助和支持文档,以及与Flash用户相关的其他网站.论坛.产品指南和升级等. 注意:如果Flash在启动时检测到没有连接到网络,选择"帮助">

《Adobe Flash CS4中文版经典教程》——1.7 使用“工具”面板

1.7 使用"工具"面板 Adobe Flash CS4中文版经典教程"工具"面板是工作区最右边的那个狭长的面板-包含选择工具.绘图和文字工具.着色和编辑工具.导航工具以及工具选项(如图1-32所示).用户将频繁使用"工具"面板,从"选择"工具切换到"文本"工具,再切换到绘图工具.当选择一种工具时,可以检查位于面板底部的选项区域,了解更多选项以及适合于任务的其他设置. 选择和使用工具当选择一种工具时,&qu

从Flash到Silverlight进阶教程-用代码来创建动画

从Flash到Silverlight进阶教程 用代码来创建动画 这节里将要讲述一个自定义用户控件最基本的操作,就好象Flash中的MovieClips一样,动态的将其添加到舞台上. 首先你将要看到如何用ActionScript来添加一个MC到舞台中. 让我们来看看在Flash中都做了什么. 新建flash文件 在第一帧添加两个按钮起好实例名称 导入一张图片,以中心注册为MovieClips,将链接标识符设置为"man" 新建立一层命名为"as",添加如下代码 as2

HTML高级教程:学习HTML 4.0事件属性

高级|教程 HTML 4.0的新特性之一是使HTML事件触发浏览器中的行为,比方说当用户点击一个HTML元素时启动一段JavaScript.以下就是可被插入HTML标签以定义事件行为的一系列属性. 假如你希望学习如何使用这些事件进行编程,那么你应该学习我们的JavaScript教程和DHTML教程. 窗口事件 (Window Events) 仅在body和frameset元素中有效. 属性 值 描述 onload 脚本 当文档被载入时执行脚本 onunload 脚本 当文档被卸下时执行脚本 表单