Flash鼠标特效:弹性框架的制作

鼠标|特效

在送上教程之前,我想先感谢一位经典的网友,他介绍了一个数学公式编辑软件MATHTYPE,对我这次写教程有了很大的帮助.但是是谁一时想不起来,又找不到.如果找到的话,我一定会把他的大名公布出来,以示感激.

这是两个月前答应一位网友写的教程,但是当初没有时间,所以拖到现在.而且这个效果还是有相当一部分的人曾经在论坛上问过怎么做的.现在笔者挤出了点时间,给大家送上这个教程.

这基本上是用AS实现的.主要用了MovieClip对象的lineTo和curveTo方法,此外还有很多人都很熟悉的韩式弹性菜单的算法.

在这里,先给大家介绍比较简单的韩式弹性菜单算法.框架弹性动作就是通过这种算法实现的.它要达到的效果就是让一个物体在目标位置两侧振动,而且振幅越来越小,最终停止在目标位置.

它的算法如下:

ObjPos=targetPos-deceleration*(ObjPos-targetPos)

你尝试让ObjPos是任意的一个数,然后让deceleration取0~1(不包括0,1),然后targetPos取一个跟ObjPos相差比较大的数,不断地代入上式算一下,你会发现ObjPos会在targetPos两侧振动,并且当前一次大于targetPos时候,这一次将小于targetPos,而且无限接近于targetPos,于是就达到弹性振动的目的了.

当然明眼人一观察就出结果.不过这个认识是感性的,如果有兴趣的话,可以看下我对这条式子的证明过程(对数学没兴趣的可以跳过)

在证明之前,先解释一点,上式两边的ObjPos是不一样的,在AS里,它并不代表相等,而是先把ObjPos当前的值代到右边,算出结果后重新对ObjPos赋值.因此,假设ObjPos原始值为a1,该式子运行一次后左边的ObjPos的值记为a2,依此类推,执行到n次后左边ObjPos的值记为an+1,所以,在数学上,实际上是进行这么一个数列的递推运算:
an=t-d(an-1-t)(其中d,t是常数)
当代码执行n次时,物体的位置就位于数列{an}的第n+1项.

因此,我们需要证明数列当a1!=t的时候,an两个相邻项之间的数值跟t的差的符号相反,并且当n趋向于无穷的时候,an=t

由此可知,如果把这段代码用setInterval调用,或者在onEnterFrame里调用的话,ObjPos的值将在targetPos两边振动,并且无限接近targetPos.这个式子用到我的鼠标效果里,这里要控制的点就是整个框的最高点.最高点的变动带动整个形状的变动,当然带动形状变动是后面的事情,我们当前先要把最高点振动的效果实现.因此,targetPos就是框架最高点最终停留的位置,而ObjPos则是框架最高点当前的位置.

下面笔者介绍的将是如何根据算出的最高点把图形描绘出来:

首先,矩形的四个顶点都是常量,而且有三条边都是直线,因此,这里用lineTo就可以实现了.

lineTo(x,y)方法比较简单,对MC调用该方法时,lineTo将在点x,y和当前MC的画图标记点连一直线,一开始默认为(0,0),所以第一次对该MC调用lineTo的时候,将在该MC上画一条从(0,0)到(x,y)的直线,然后画图标记点就改为(x,y)了.如果不希望一开始画上这条线的话,或者画完一根线以后,希望再画一根,并且不要跟现在的线连在一起的话,可以先用moveTo(x,y)方法改变画图标记点.

curveTo(controlX,controlY,anchorX, anchorY)方法则是该教程的一个重点,因为波形的绘制都是通过该方法实现的.而且过两点有无数条曲线,所以,如何保证波形曲线的平滑性,是个很重要的问题.

下面先做一个小测试:

新建一个Flash文档,在帧上添加下面的代码:

var initX = 100;
var inity = 200;
var controlX;
var controlY;
var anchorX = 50;
var anchorY = 50;
this.onMouseMove = function() {
this.createEmptyMovieClip("curve", 1);
with (curve) {
lineStyle(1, 000000, 50);
moveTo(initX, initY);
ControlX = _xmouse;
ControlY = _ymouse;
lineTo(controlX, controlY);
lineTo(anchorX, anchorY);
moveTo(initX, inity);
curveTo(controlX, controlY, anchorX, anchorY);
}
updateAfterEvent(this.onMouseMove)
};

然后,测试影片,在舞台上移动鼠标,观察曲线的变化(其中,鼠标所在的点是控制点)
也可以直接在这里预览:

你会发现,不管控制点怎样变化,画出来的曲线都有一个特点,就是控制点跟曲线两个顶点的连线都和曲线相切,并且弧线总是C形,不是S形.这就是指导我们画出平滑曲线的重要结论.

观察下面的图:

可以发现,在除红线以外的所有曲线中,跟红线的切线相切,并且方向跟红线相反的两根蓝线是可以跟红线平滑过渡的,数学上这种现象称为连接.另外,切线本身也能跟红线实现平滑过渡.

由此可以正确控制波形的形状.

波形的草图如下:

红色是曲线部分,一看就知道不是个简单的C形,你尝试在Flash,或FW或者PS里把这条路径画出来,再看看锚点的组成,你就可以发现,这么条曲线可以分成三条C形曲线.

如果就这样画三段,那么,波形最高点的坐标是由控制点决定的,很难精确,所以,最好在最高点再添加一个锚点,这样最高点的位置就准确了.

但是,其它锚点怎么确定呢?

其实根据已知的条件,是无法得出其它锚点的位置的,这个一般凭感觉来确定就好了.姑且让整条曲线的宽度为width,然后假设最高点的横坐标是xm,那么,曲线最左点的横坐标是xm-width/2,最右点的横坐标是xm+width/2,中间两个过渡点的横坐标,一个在xm-width/2和xm之间,一个在xm和xm+width/2之间,为了方便,也为了自然,选取中点,xm+width/4,xm+3*width/4,纵坐标的选取也相似.

现在要讨论的是控制点的问题,就是怎么让每段曲线之前能实现平滑的连接.

首先,作出曲线各锚点的切线.那么,相邻曲线段的切线之间的交点(A,B,C,D)就是相应曲线的控制点.

可见,A,D均位于波形最低点,而B,C位于波形最高点.另外,A,A1,B三点共线,C,C1,D三点也共线,这样就可以保证整个波形都是平滑的.
但是,这样A,B,C,D的位置还是不能确定下来,但可以肯定的一点是,四个点的横坐标从左到右的顺序依次是A,B,C,D.那么,比较方便而且比较美观的选择是让A的横坐标位于A0和A1的中间,那么可以算出B点的位置恰好位于A1和顶点的中间,同样道理,C点在顶点和和C1点的中间,D点在C1点和D0点的中间.

理论基础基本齐全,下面可以开始动手写程序了.

不过笔者发现,有个这个基础原来还不足够,依然会遇到很多很棘手的问题.在测试的时候才发现的.

时间: 2024-09-07 16:25:04

Flash鼠标特效:弹性框架的制作的相关文章

Flash鼠标特效精选实例(1)--3D鼠标跟随

第一节:3D鼠标跟随 该实例实现的是一3D小球随"鼠标"跟随效果,在制作过程中主要使用了自定义函数进行影片控制,大量使用了循环语句和赋值语句.影片最终播放效果如图1.1所示: 图1.1 影片最终效果 1.新建一影片,通过属性面板设置其大小为600pxX450px(单位为象素)背景色为#000000. 2.新建一影片剪辑"Sphere",选取"椭圆工具",在工作区中绘制一椭圆,并去掉其轮廓.打开"混色器"面板进行如图1.2所示的

Flash鼠标特效精选实例(2)--4D鼠标

第二节:4D鼠标 该实例实现的是,模仿4D鼠标中键效果,当单击鼠标中键时,拖动鼠标可以控制文本滚动,最终效果如图2.1所示,要实现这一效果,具体步骤如下: 图2.1 模拟鼠标中键效果 1.新建一影片,通过属性面板设置其大小为400pxX300px(单位为象素)背景色为#CCCCCC. 2.新建一图开元件"txt",进入其编辑状态,将默认图层更名为"文本",在工作区中输入文本,可以任意输入,不会影响效果.再新建一图层"背景",为"文本&q

Flash趣味鼠标特效大作战

鼠标|特效 从很早的版本开始,利用Flash就可以制作很多有趣的鼠标特效,下面我们来重温一下,制作几个有趣的鼠标特效. 一.实现原理 其实鼠标特效的原理都是大同小异的,让Clip先停在某一帧上面,当鼠标滑过的时候,播放相应的特效.一个Clip看起来不怎么好看,但几十个Clip放在场景中,靠规模制胜,鼠标触发播放相应的效果,看起来就颇为壮观了. 下面我们就来实现三个不同的实例,每一个实例都代表着一种类型的鼠标特效. 二.实例1 这个实例实现的是有关线变换的鼠标特效,与线的变换有关的鼠标特效都与这个

Flash轻松实现鼠标特效

鼠标|特效 作者:虬髯客 QQ:4077130 转载请注明出处和作者! 在网上经常看到一些做得非常cool的鼠标,看起来好像很复杂.但借助于FLASH强大的脚本语言,这根本不算什么.好了,不多说,现在我们就亲手做一个. 效果演示: 点击这里下载源文件 制作步骤: 1.打开Flash,新建一个"Flash文档",并保存. 2.按"Ctrl+F8",新建一个"影片剪辑",命名为"star",如图: 3.按"Ctrl+F8

用Flash动画特效制作:文字炸开

flash动画|特效 想必喜欢Flash制作的朋友一定对一些特殊的效果很感兴趣,今天跟大家一起分享下用 Flash6.0 制作"爆炸字体"的方法.其他版本方法和步骤类似. 最终效果: 第一步:打开 Flash6.0 软件→新建一个新的场景 , 然后点菜单栏"修改" →"文档属性" ,将其背景色设为黑色,点击确定. 第二步:按一下 Ctrl+F8, 新建一个元件,名称为 po, 行为为图像,点击确实. 第三步:在元件里用文本用工具输入个"

flash在有限的页面内制作大的地图

核心提示:flash在有限的页面内制作大的地图教程. 多个朋友因工作或爱好的需要,询问如何用flash在有限的页面内制作大的地图,并链接.显示有关地点的信息,为此将我自己做的一个记录旅游地点的flash地图略作精简.修改,做了这个flash,并将关键部分做法介绍如下(原有的那个包括显示信息中的文字和采用的旅游照片,将近10 M,太大了,无法上传). 作品见下方(好久没发帖了,不知该怎么发swf文件了,把考屏图放下面方便了解) 特点: 缩小地图以适应页面大小的局限,用放大镜来放大缩小了的地图,使能

Flash鼠标点击显示打散动画

核心提示:Flash鼠标点击显示打散动画教程. 1.新建Flash文档,550*400,其它默认. 2.创建影片剪辑,选椭圆工具,笔触无,填充色放射渐变,画一个椭圆(形状自定,我相你会比我画得更好),右键库中设置链接,类名Ball. 3.返回场景1,第一层建背景(随意),新建as图层,在as图层第一帧输入代码: //小球的初始位置 //小球的初始位置 var ballx:Number = 275; var bally:Number = 400; //小球运动速度 var speed:Number

Flash MV音乐和字幕的制作

音乐配上字幕几乎已经成为了MTV的共有形式,本文我们将讲解在Flash MV中音乐和字幕的制作方法.文章末尾提供fla原文件下载. 1.在场景中新建一个图层,图层名称为"music",使用File Import命令导入外部的音乐文件(该音乐文件最好是MP3格式).然后打开Window Library库面板,应该就可以看到这个音乐角色.将它拖放到music图层的第1帧(图1). 2.选中music图层的第1帧,在Properties属性面板中的sound音乐角色属性部分,将Sync下拉选

代码-页面框架布局制作源码

问题描述 页面框架布局制作源码 请问页面框架布局制作代码如何Javascript部分编写,左菜单布局CSS样式,求分享 解决方案 看看DWZ富客户端框架是否符合你的需求.